关于IIS和Windows身份validation的NancyFx

我已经将MVC + AngularJS应用程序转换为使用NancyFx + AngularJS(因为我并没有真正使用任何MVC的东西)。 我正在使用VS2013,它在IIS(以及我的开发环境中的IIS Express)下运行。

我可以通过检查OwinEnvironment的server.User组件来获取当前登录的用户。 我目前正在使用Microsoft.Owin.Host.SystemWeb作为大多数演示。 当我在我的模块中向Get请求添加RequiresAuthentication时,即使我已登录,我也会在IE中弹出一个输入凭据。即使我输入凭据,我只是不断获得弹出窗口,它永远不会到达网站。

我有一些问题:

1)如果使用Windows身份validation和RequiresAuthentication,我仍然需要在web.config中使用身份validation模式=“Windows”。

2)是否可以在没有Microsoft.Owin.Host.SystemWeb的情况下使用IIS以避免ASP.NET管道? 我遇到过关于Project Helios和Microsoft.Owin.Host.IIS(Nuget)的文章,但这已经有一段时间没有用过了,只是一个Alpha – 这是怎么回事?

3)使用IIS,NancyFX和Windows身份validation以及RequiresAuthentication和Roles的事实上的方法是什么?

我看了很多文章和stackoverflow问题,但还没有找到明确的答案。

1)是的,您必须告诉IIS模块使用Windows身份validation

2)我不相信。 虽然如果你真的不喜欢IIS,你可以使用OWIN自托管来执行Windows身份validation

即使你设置了IIS来赢得auth,nancy也不会认出这个。 您可以通过覆盖RequestStartup()并设置当前用户username来使用引导程序中的Pipelines.BeforeRequest来validation当前请求。 以下假定为.NET 4.5

当然,您可能希望进行标准空值检查,而不是。

public class User : IUserIdentity { private readonly ClaimsPrincipal claimsPrincipal; public User(ClaimsPrincipal claimsPrincipal) { this.claimsPrincipal = claimsPrincipal; } public string UserName { get { return claimsPrincipal.Identity.Name; } } public IEnumerable Claims { get { return claimsPrincipal.Claims.Select(c => c.ToString()); } } } public class Bootstrapper : DefaultNancyBootstrapper { protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context) { pipelines.BeforeRequest += ctx => { ctx.CurrentUser = new User(Thread.CurrentPrincipal as ClaimsPrincipal); return null; }; } }