在 .NET MVC 应用程序中处理 JWT 过期

Posted

技术标签:

【中文标题】在 .NET MVC 应用程序中处理 JWT 过期【英文标题】:Handling JWT expiration in .NET MVC-application 【发布时间】:2017-02-14 02:05:49 【问题描述】:

我有一个 ASP.NET MVC 应用程序,它在 Session 中存储来自我的 Web API 的 JWT 令牌和刷新令牌。我的问题是当 JWT 令牌过期并且是时候刷新它时该怎么办。在我看来,我的两个选择是:

    尝试使用 JWT-token 向 Web API 发出请求,如果返回 401 Unauthorized,请尝试刷新 JWT-token。

    使用计时器在 JWT 令牌过期之前自动刷新它。

使用这两种方法中的任何一种有什么优势,我如何以一种简单的方式以编程方式实现它们?例如,如果我使用选项 1,是否必须对 API 的每次调用都使用 try 和 catch?

【问题讨论】:

在 Session 中存储来自我的 Web API 的 JWT 令牌和刷新令牌 为什么要存储在会话中? 【参考方案1】:

我决定使用选项 2,以尽量减少对 API 的调用次数。然后,我使用 HttpClient 工厂方法创建了一个基本控制器类,该方法还检查 JWT 是否即将过期:

        public HttpClient GetHttpClient(string baseAdress)
        
            var client = new HttpClient();
            client.BaseAddress = new Uri(baseAdress);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            string token;
            if (Session["access_token"] != null)
             
                var jwthandler = new JwtSecurityTokenHandler();
                var jwttoken = jwthandler.ReadToken(Session["access_token"] as string);
                var expDate = jwttoken.ValidTo;
                if (expDate < DateTime.UtcNow.AddMinutes(1))
                    token = GetAccessToken().Result;
                else
                    token = Session["access_token"] as string;
            
            else
            
                token = GetAccessToken().Result;

            
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            Session["access_token"] = token;
            return client;
        

【讨论】:

以上是关于在 .NET MVC 应用程序中处理 JWT 过期的主要内容,如果未能解决你的问题,请参考以下文章

[转]菜鸟程序员之Asp.net MVC Session过期异常的处理

.net MVC 重定向与 JWT 令牌

使用 WIF 和 jquery ajax 请求时 ASP.NET MVC 3 中的会话 Cookie 过期处理

在 ASP.NET MVC 中过期后刷新访问令牌

JWT 使用数据库处理过期

在 Spring MVC 中处理 JWT 异常