我有一个ASP.NET MVC应用程序,它在Session中存储来自我的Web API的JWT令牌和刷新令牌。我的问题是当JWT令牌到期时该怎么办,是时候刷新它了。我认为我的两个选择是:
尝试使用JWT令牌向Web API发出请求,如果它返回401 Unauthorized,请尝试刷新JWT令牌。
使用计时器在JWT令牌过期前自动刷新。
使用这两种方法中的任何一种有什么好处,以及如何以简单的方式以编程方式实现它们?例如,如果我使用选项1,我是否必须使用try和catch来调用API?
答案 0 :(得分:9)
我决定选择选项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;
}