我目前坚持使用如何在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)
};
});
目前,这只会引发一个例外,即&#34;终身验证器失败&#34; ..以及我在哪里。
我是以正确的方式来做这件事的吗? 这是检查过期的正确位置吗?我具体要求API如何从此处发出刷新令牌?
答案 0 :(得分: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