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

Phi*_*röm 3 c# asp.net asp.net-mvc session jwt

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

  1. 尝试使用JWT令牌向Web API发出请求,如果它返回401 Unauthorized,请尝试刷新JWT令牌.

  2. 使用计时器在JWT令牌到期之前自动刷新它.

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

Phi*_*röm 11

我决定使用选项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;
        }
Run Code Online (Sandbox Code Playgroud)