使用 JwtBearerAuthentication 在 aspnet5 rc1 Web API2 身份 3 中发出刷新令牌

Posted

技术标签:

【中文标题】使用 JwtBearerAuthentication 在 aspnet5 rc1 Web API2 身份 3 中发出刷新令牌【英文标题】:Issue a refresh token in aspnet5 rc1 Web API2 identity 3 using JwtBearerAuthentication 【发布时间】: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 从这里发出刷新令牌?

【问题讨论】:

【参考方案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 响应:***.com/a/34190002/542757。要回答您的附加问题:是的,客户端应用程序在收到新令牌 (tools.ietf.org/html/rfc6749#section-6) 时必须丢弃旧令牌。

以上是关于使用 JwtBearerAuthentication 在 aspnet5 rc1 Web API2 身份 3 中发出刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)