在同一个项目中,在Nancy中使用任何形式的令牌授权来保护模块的最佳方法是什么?我需要两种类型的安全性,我不想创建单独的应用程序:一个用Form保护视图,另一个用于使用Token返回JSON的API。
我是nancy的新手,我刚刚将一个MVC 5应用移植到南希。到目前为止,我没有回头! :-)。喜欢简单的方法。
无论如何,我想听听你的意见。
谢谢!
答案 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>()));
}
}
这适用: - )