1

我目前停留在如何在 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 从此处发出刷新令牌?

4

1 回答 1

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
于 2016-01-22T00:20:33.243 回答