我已经按照文档页面中的Quickstart进行操作,并使用IdentityServer进行身份验证,从而实现三种服务(IdentityServer,一种Api服务,一种ASPNET MVC应用程序)的工作配置.
一切正常(登录,登录,授权等),直到access_token到期后1小时.此时,MVC应用程序开始(正确地)从API服务接收401(因为令牌已过期).那时,我知道我应该使用refresh_token来获取新的access_token.
我正在寻找一种自动刷新access_token的机制,并偶然发现:https://github.com/mderriey/TokenRenewal/blob/master/src/MvcClient/Startup.cs(来自这个答案).我尝试使用它,但它不起作用(TokenEndpointResponse即使身份验证成功,也为null).
我理解如何使用a refresh_token来获取新的access_token,但是在我拥有它之后,我将如何将其插回到cookie中以便将来的请求可以访问新的令牌?
我想知道如何使用混合流刷新IdentityServer4客户端中的访问令牌,并使用ASP.NET Core MVC构建.
如果我已正确理解整个概念,则客户端首先需要具有"offline_access"范围,以便能够使用刷新令牌,这是启用短期访问令牌的最佳实践,并且能够撤消刷新令牌以防止任何新的访问令牌发给客户.
我成功获得了访问令牌和刷新令牌,但是我应该如何处理MVC客户端中访问令牌的实际更新过程?
OpenId Connect(OIDC)中间件可以自动处理吗?或者我应该通过基本检查访问令牌是否已过期或将很快到期(即将到来的30秒)来检查访问令牌的到期时间我通过基本检查访问令牌是否到期(即将到来的30秒)然后通过使用刷新令牌调用令牌端点来刷新访问令牌?
是否建议在Controller操作方法中使用IdentityModel2库TokenClient扩展RequestRefreshTokenAsync方法来调用令牌端点?
我已经看到OIDC中间件事件中的代码请求访问令牌并使用响应存储包含过期日期时间的声明.问题是我的OIDC已经以某种方式自动请求访问令牌,因此在收到第一个访问令牌后直接请求新的访问令牌感觉不太好.
没有访问令牌刷新逻辑的Controller操作方法示例:
public async Task<IActionResult> GetInvoices()
{
var token = await HttpContext.Authentication.GetTokenAsync("access_token");
var client = new HttpClient();
client.SetBearerToken(token);
var response = await client.GetStringAsync("http://localhost:5001/api/getInvoices");
ViewBag.Json = JArray.Parse(response).ToString();
return View();
}
Run Code Online (Sandbox Code Playgroud)