关于IIS和Windows身份验证的NancyFx

时间:2015-02-24 23:44:57

标签: c# iis-7.5 windows-authentication owin nancy

我已经将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问题,但还没有找到明确的答案。

1 个答案:

答案 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;
        };
    }

}