在同一个项目中结合Authorization.Forms和Authorization.Token的最佳方法?

时间:2014-06-27 14:43:56

标签: c# nancy

在同一个项目中,在Nancy中使用任何形式的令牌授权来保护模块的最佳方法是什么?我需要两种类型的安全性,我不想创建单独的应用程序:一个用Form保护视图,另一个用于使用Token返回JSON的API。

我是nancy的新手,我刚刚将一个MVC 5应用移植到南希。到目前为止,我没有回头! :-)。喜欢简单的方法。

无论如何,我想听听你的意见。

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您使用Nancy和AngujarJS(例如)创建单页应用程序,则只需使用令牌身份验证。 (我推荐这个)

您可以使用此代码在bootstraper中启用这两种方法(此代码用于启用表单身份验证和基本身份验证)

(这可行,但在我看来并不是一个优雅的解决方案)

protected override void RequestStartup(TinyIoCContainer container, Nancy.Bootstrapper.IPipelines pipelines, NancyContext context)
    {
        base.RequestStartup(container, pipelines, context);

        var credentials = ExtractCredentialsFromRequest(context);
        if(credentials !=null)
            context.CurrentUser = container.Resolve<IUserValidator>().Validate(credentials[0], credentials[1]);
    }

    private string[] ExtractCredentialsFromRequest(NancyContext context)
    {
        var authHeader = context.Request.Headers["Authorization"].SingleOrDefault();
        if (authHeader == null)
            return null;

        var credentials = authHeader.Split(new[]{':'}, StringSplitOptions.RemoveEmptyEntries);
        if (credentials.Length != 2)
            return null;

        return credentials;
    }

还有另一个选项(我从未使用过它)是nancy的hibryd auth的nuget包

https://www.nuget.org/packages/Nancy.Authentication.HybridStatelessAuthorizationHeaderAndForms/

答案 1 :(得分:2)

谢谢。受您的建议启发,我想出了以下代码:

    protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context)
    {
        base.RequestStartup(container, pipelines, context);
        if (context.Request.Headers["Authorization"].SingleOrDefault() == null)
        {
            //no Authorization header found / request cannot be authenicated using token authentication. Enable Form authentication.
            var formsAuthConfiguration = new FormsAuthenticationConfiguration()
            {
                RedirectUrl = "~/user/login",
                UserMapper = container.Resolve<IUserMapper>()
            };
            FormsAuthentication.Enable(pipelines, formsAuthConfiguration);
        }
        else
        {
            //Authorization header found. Enable Token authentication.
            TokenAuthentication.Enable(pipelines, new TokenAuthenticationConfiguration(container.Resolve<ITokenizer>()));
        }           
    }

这适用: - )