我在Nancy 1.4.5中实现了JWT无状态身份验证,它过去可以正常工作。 将我的项目移植到Nancy 2.0.0时,身份验证机制不再起作用。
在引导程序的ApplicationStartup方法中,我有:
protected override void ApplicationStartup(IKernel container, IPipelines pipelines)
{
#region JWT authentication
// JWT stateless authentication, see: https://foreverframe.net/nancy-meets-jwt-authentication/
var secretKey = LocalConstants.Authorization.SecretKey;
string cryptografyAlgorithm = LocalConstants.Authorization.CryptografyAlgorithm;
string bearerDeclaration = LocalConstants.Authorization.HttpHeaderBearerDeclaration;
var identityProvider = new IdentityProvider(secretKey, cryptografyAlgorithm, bearerDeclaration);
var statelessAuthConfig = new StatelessAuthenticationConfiguration(identityProvider.GetUserIdentity);
StatelessAuthentication.Enable(pipelines, statelessAuthConfig);
#endregion
...
在运行时,客户端可以执行登录并正确获取JWT。他们在后续请求中将JWT存储在HTTP标头中。当后续请求到达服务器时,我的identityProvider的GetUserIdentity方法将读取JWT并正确返回有效的ClaimsPrincipals。
在我模块的
中 this.RequiresAuthentication();
但是,会引发Nancy.ErrorHandling.RouteExecutionEarlyExitException,原因为“需要身份验证”,原因为“需要身份验证”,响应为“未经授权的文本/ html”,状态码为Nancy.HttpStatusCode.Unauthorized。
将无状态身份验证移植到Nancy 2.0.0的正确方法是什么?
答案 0 :(得分:0)
我自己找到了解决方案:问题不在配置中,而是在服务器中使用JWT的方式。作为参数传递给StatelessAuthenticationConfiguration对象的函数(在我的示例中为identityProvider.GetUserIdentity)应返回经过身份验证的ClaimsIdentity。
为此,请传递一个非null,非空字符串作为authenticationType参数,例如:
ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims, "CustomAuthenticationType");
在我之前的尝试中,我只是通过了声明,导致ClaimsIdentity的IsAuthenticated属性评估为False。