将JWT无状态身份验证从Nancy 1.4.5移植到2.0.0

时间:2019-05-10 15:10:09

标签: authentication jwt nancy

我在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的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案:问题不在配置中,而是在服务器中使用JWT的方式。作为参数传递给StatelessAuthenticationConfiguration对象的函数(在我的示例中为identityProvider.GetUserIdentity)应返回经过身份验证的ClaimsIdentity。

为此,请传递一个非null,非空字符串作为authenticationType参数,例如:

ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims, "CustomAuthenticationType");

在我之前的尝试中,我只是通过了声明,导致ClaimsIdentity的IsAuthenticated属性评估为False。