我已经将MVC + AngularJS应用程序转换为使用NancyFx + AngularJS(因为我实际上并没有使用任何MVC的东西)。我正在使用VS2013,它在IIS(和我的开发环境中的IIS Express)下运行。
我可以通过检查OwinEnvironment的server.User组件来获取当前登录的用户。我目前正在使用Microsoft.Owin.Host.SystemWeb作为大多数演示。当我在我的模块中向Get请求添加RequiresAuthentication时,即使我已登录,我也会在IE中弹出一个输入凭据。即使我输入凭据,我只是不断获得弹出窗口,它永远不会到达该网站。
我有几个问题:
1)如果使用Windows身份验证和RequiresAuthentication,我仍然需要在web.config中使用身份验证模式=“Windows”。
2)是否可以在没有Microsoft.Owin.Host.SystemWeb的情况下使用IIS以避免ASP.NET管道?我发现了有关Project Helios和Microsoft.Owin.Host.IIS(Nuget)的文章,但这已经有一段时间没有用过了,只是一个Alpha - 这是怎么回事?
3)使用IIS,NancyFX和Windows身份验证以及RequiresAuthentication和角色的事实上的方法是什么?
我看了很多文章和stackoverflow问题,但还没有找到明确的答案。
答案 0 :(得分:3)
1)是的,您必须告诉IIS模块使用Windows身份验证
2)我不相信。虽然如果你真的不喜欢IIS
,你可以使用OWIN自托管来执行Windows身份验证即使你设置了IIS来赢得auth,nancy也不会认出这个问题。您可以使用引导程序中的Pipelines.BeforeRequest通过覆盖RequestStartup()并设置当前用户username来验证当前请求。以下假定为.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<string> 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;
};
}
}