请参阅下面的代码以解决此问题
我正在尝试找到处理ASP.NET Core 2.1中已过期的刷新令牌的最佳和最有效的方法.
让我解释一下.
我正在使用OAUTH2和OIDC来请求授权代码授权流程(或使用OIDC的混合流程).此流/授权类型使我可以访问AccessToken和RefreshToken(授权代码,但这不适用于此问题).
访问令牌和刷新令牌由ASP.NET核心存储,并且可以分别使用HttpContext.GetTokenAsync("access_token");和检索HttpContext.GetTokenAsync("refresh_token");.
我可以刷新access_token没有任何问题.当问题refresh_token以某种方式过期,撤销或无效时,问题就会发挥作用.
正确的流程是让用户再次登录并再次返回整个身份验证流程.然后应用程序获得一组新的令牌返回.
我的问题是如何以最好和最正确的方法实现这一目标.我决定编写一个自定义中间件,access_token如果它已经过期,它会尝试续订.然后,中间件将新令牌设置AuthenticationProperties为HttpContext,以便以后管道中的任何调用都可以使用它.
如果由于任何原因刷新令牌失败,我需要再次调用ChallengeAsync.我从中间件调用ChallengeAsync.
这是我遇到一些有趣的行为的地方.然而,大部分时间这都有效,有时候我会得到500个错误而没有关于什么是失败的有用信息.几乎看起来中间件试图从中间件调用ChallengeAsync有问题,也许另一个中间件也试图访问上下文.
我不太清楚发生了什么事.我不太确定这是否是适合这种逻辑的地方.也许我不应该在中间件中使用它,也许在其他地方.也许Polly for HttpClient是最好的地方.
我愿意接受任何想法.
感谢您的任何帮助,您可以提供.
代码解决方案对我有用
感谢MickaëlDerriey的帮助和指导(请务必在此解决方案中查看他的答案以获取更多信息)这是我提出的解决方案,它为我工作:
options.Events = new CookieAuthenticationEvents
{
OnValidatePrincipal = context =>
{
//check to see if user is authenticated first
if (context.Principal.Identity.IsAuthenticated)
{
//get the users tokens
var tokens = context.Properties.GetTokens();
var refreshToken = tokens.FirstOrDefault(t => t.Name == "refresh_token");
var accessToken = tokens.FirstOrDefault(t => t.Name == "access_token");
var exp …Run Code Online (Sandbox Code Playgroud) oauth openid-connect asp.net-core refresh-token asp.net-core-2.1