【问题标题】:.NET JWT Refresh Tokens: How to handle requests made while retrieving the new token.NET JWT 刷新令牌:如何处理在检索新令牌时发出的请求
【发布时间】:2016-03-31 20:58:19
【问题描述】:

我们想使用 JSON Web Token (JWT) 作为我们新 API 的 API 密钥。它们将在服务器应用程序级别使用,而不是让最终用户持久保存在缓存中。它将允许我们在授权方面比基本身份验证更精细,而不会牺牲简单性。在研究了这个想法后,我们发现一个名为“Auth0”(https://auth0.com/)的服务正在这样做,这似乎验证了我们的想法。

问题是我们似乎无法无限期地发布 JWT,因为 .NET “OAuthAuthorizationServerOptions”似乎迫使我们设置过期时间。我们已经阅读了有关“刷新令牌”的信息,但经过数小时的研究,并不清楚刷新期间发出的请求会发生什么。

例如如果客户端请求一个新的令牌,并且在检索新 JWT 期间正在发出其他请求,那么这些请求不会失败吗?

我发现一些其他平台允许旧令牌额外保持活动一分钟以适应这种情况(例如这篇文章:https://laracasts.com/discuss/channels/general-discussion/how-to-refreshing-jwt-token),但同样,它似乎在 .NET 中不可用。

谁能解释在 .NET 中刷新令牌的正确方法,但具体谈谈在检索新令牌并将其保存在客户端中时遵守请求的问题?

用代码更新我们的问题...

令牌生成:

private void OAuthTokenGeneration(IAppBuilder app)
    {
        // Configure the db context and user manager to use a single instance per request
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

        OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            //For Dev enviroment only (on production should be AllowInsecureHttp = false)
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/oauth/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(365),
            Provider = new CustomOAuthProvider(),
            AccessTokenFormat = new CustomJwtFormat(ConfigurationManager.AppSettings["as:live"])
        };

        // OAuth 2.0 Bearer Access Token Generation
        app.UseOAuthAuthorizationServer(OAuthServerOptions);
    }

授权...

        private void OAuthTokenConsumption(IAppBuilder app)
    {
        var issuer = ConfigurationManager.AppSettings["as:live"];
        string audienceId = ConfigurationManager.AppSettings["as:AudienceId"];
        byte[] audienceSecret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["as:AudienceSecret"]);

        // Api controllers with an [Authorize] attribute will be validated with JWT
        app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                AllowedAudiences = new[] { audienceId },
                IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
                {
                    new SymmetricKeyIssuerSecurityTokenProvider(issuer, audienceSecret)
                }
            });
    }

【问题讨论】:

    标签: c# jwt


    【解决方案1】:

    令牌应该在过期之前刷新,而不是之后。旧令牌和新令牌都将有效,直到它们最终到期。在这种情况下,在刷新时使用旧令牌发出的请求将正常工作。


    这是我的建议,而不是使用过期的 JWT + 刷新令牌:

    OAuthAuthorizationServerOptions 与 JWT 认证无关。我相信您正在寻找JwtBearerAuthenticationOptions。这个 JWT 中间件只对配置的参数进行验证,比如受众、签名等,不颁发令牌,所以不需要配置过期时间。

    Auth0 的 API 使用 JWT 进行身份验证,但没有发布这些令牌的服务。相反,令牌是由 API 的任何授权使用者使用共享 API 密钥创建的,该密钥用于对令牌进行签名。例如,可以使用API Explorer 在浏览器本地生成令牌并且没有到期日期。还有一个端点可以按 ID(jti 声明)将令牌列入黑名单,以防它们被泄露或不再需要。

    安全方面的人可能会争辩说,这实际上等同于拥有一个过期的 JWT + 刷新令牌,因为无论如何您都需要一种方法来将受损的刷新令牌列入黑名单。它也更容易理解,不使用不透明的令牌,并且 API 不那么繁琐。

    【讨论】:

    • 我们使用JwtBearerAuthenticationOptions进行授权,但我们使用UseOAuthAuthorizationServerOAuthAuthorizationServerOptions发行令牌。我认为您是在建议我们放弃这种发行令牌的方法,而只保留授权部分。我想这可能是一种选择,但我们更希望有一种方法来为客户端生成令牌(不编写我们自己的)。你知道UseOAuthAuthorizationServer 之外的东西会生成没有到期日期的令牌吗?我用一些代码更新了这个问题。
    • 不太熟悉 C# 世界,但您可以使用jwt.io 列出的任何库手动创建具有可配置到期日期的 JWT。
    • 感谢您抽出宝贵时间回复,因为我确实觉得使用不会过期的令牌实现自定义令牌提供程序是解决该问题的好方法。这可能比刷新令牌更好地解决我的问题。但是,最初的问题是如何处理在刷新令牌期间发出的请求。我仍然无法弄清楚如何处理它。因此,我很难将其标记为答案,因为它比确切答案更像是另一种选择。
    • 不客气!如果我理解正确的话,会更新您原来问题的答案。
    • 如果我是对的,JWT 令牌过期时间应该变小,据我所知,刷新令牌是实现的最佳方式。我正在使用 JWT 刷新令牌实现,如果@user2341148 我会在完成后发布答案:)
    猜你喜欢
    • 2019-01-25
    • 2017-07-18
    • 2016-01-05
    • 2019-07-01
    • 2016-03-05
    • 2016-06-25
    • 2014-08-01
    • 1970-01-01
    • 2022-12-23
    相关资源
    最近更新 更多