在 .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过期异常的处理