【问题标题】:Issue a refresh token in aspnet5 rc1 Web API2 identity 3 using JwtBearerAuthentication使用 JwtBearerAuthentication 在 aspnet5 rc1 Web API2 身份 3 中发出刷新令牌
【发布时间】:2016-04-28 09:03:03
【问题描述】:

我目前停留在如何在 aspnet5 中实现刷新令牌流的机制上。

目标:我想拦截每笔交易以检查令牌是否已过期或即将过期,如果是,则更新它。 (我已经在验证它的签名)。

我发现在设置 JWT 选项时,我可以在 Startup.cs 中发现到期时间:

app.UseJwtBearerAuthentication(options =>
        {
            options.Audience = "http://localhost:7001"; 
            //options.Authority = "http://localhost:7001";
            options.AutomaticAuthenticate = true;
            options.RequireHttpsMetadata = false;

            options.TokenValidationParameters = new TokenValidationParameters()
            {
                LifetimeValidator = (DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters) =>
                {                      
                    if (expires.Value < DateTime.UtcNow)
                    {
                        // it's expired! issue a refresh token here? 
                        return false;
                    }
                    return true;
                },
                IssuerSigningKey = key,
                ValidAudience = tokenOptions.Audience,
                ValidIssuer = tokenOptions.Issuer,
                ValidateSignature = true,
                ValidateLifetime = true,
                ClockSkew = TimeSpan.FromMinutes(10)
            };
        });

目前这只是引发“生命周期验证器失败”的异常......这就是我所在的地方。

我这样做的方式是否正确? 这是检查过期的正确位置吗?我如何具体要求 API 从这里发出刷新令牌?

【问题讨论】:

    标签: rest authentication asp.net-core jwt http-token-authentication


    【解决方案1】:

    我这样做的方式是否正确?这是检查过期的正确位置吗?

    否:尽管资源服务器(即 API 端点)应始终确保收到的令牌仍然有效,但更新过期令牌不是它们的责任。

    这绝对是客户端应用程序应该向发布刷新令牌的授权服务器询问自己的事情。为此,他们可以使用令牌响应中返回的 expires_in 属性作为提示和/或从您的 API 捕获 401 响应,以确定他们正在使用的访问令牌是否仍然有效。

    我如何具体要求 API 从此处发出刷新令牌?

    从刷新令牌发出新的访问令牌通常由授权服务器/身份提供者完成。如果您添加有关应用程序这方面的更多详细信息肯定会有所帮助(它是否支持 OAuth2 或 OpenID Connect?)

    使用 OAuth2 服务器时,可以使用 refresh_token 授权来检索新的访问令牌:

     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded
    
     grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
    

    【讨论】:

    • 谢谢@Pinpoint。我希望你能回答;)。我将编辑我的代码以进行演示,并且我现在了解如何执行第一部分:向客户端返回 401 以通知无效令牌。就发布刷新令牌而言,我的应用程序只是一个 Web Api 项目,它充当身份验证服务器(签署/发布和接收令牌)。我还没有设置 OAuth 或 OpenId。因此,如果我向客户端返回一个刷新令牌,我需要做的就是用刷新令牌替换 localStorage 中过期的令牌,并在所有后续调用中发送该新令牌,对吗?
    • 仅供参考,JWT 不记名中间件应自动返回 401 响应,但 RC1 版本中存在一个错误,在这种情况下会导致 500 响应:stackoverflow.com/a/34190002/542757。要回答您的附加问题:是的,客户端应用程序在收到新令牌 (tools.ietf.org/html/rfc6749#section-6) 时必须丢弃旧令牌。
    猜你喜欢
    • 2017-08-14
    • 2015-09-27
    • 1970-01-01
    • 2017-11-08
    • 2016-03-04
    • 2018-05-06
    • 2021-11-01
    • 2019-08-30
    • 1970-01-01
    相关资源
    最近更新 更多