相关疑难解决方法(0)

处理ASP.NET Core中的过期刷新标记

请参阅下面的代码以解决此问题

我正在尝试找到处理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

12
推荐指数
2
解决办法
4280
查看次数