我有一個自定義類,當用戶從服務器請求數據或任何內容時,我用它來使令牌失效Authorize但每當令牌過期時,原則仍然返回為 true,并且仍然調用控制器并獲取數據。IsAuthenticated我希望它做的是使令牌失效并顯式注銷用戶退出系統。我找不到任何有用的東西。如果需要,我可以提供JWT屬性/過濾器的代碼更新 1:令牌生成public static string GenerateToken(User user){ int expireMinutes; try { expireMinutes = string.IsNullOrEmpty(ConfigurationManager.AppSettings["SessionTimeInMinutes"]) ? 30 : int.Parse(ConfigurationManager.AppSettings["SessionTimeInMinutes"]); } catch (Exception) { expireMinutes = 30; } var symmetricKey = Convert.FromBase64String(Secret); var tokenHandler = new JwtSecurityTokenHandler(); var now = DateTime.Now; var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Email, user.Email) ,new Claim(ClaimTypes.Name, user.FirstName + " " + user.LastName) ,new Claim("uid", user.Id.ToString()) ,new Claim("cid", user.ClientId.ToString()) ,new Claim("rid", string.Join(",", user.Roles.Select(r => r.RoleId).ToList())) }), Expires = now.AddMinutes(Convert.ToInt32(expireMinutes)), IssuedAt = now, SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(symmetricKey), SecurityAlgorithms.HmacSha256Signature) }; var stoken = tokenHandler.CreateToken(tokenDescriptor); var token = tokenHandler.WriteToken(stoken); return token;}
2 回答

qq_遁去的一_1
TA貢獻1725條經驗 獲得超8個贊
首先:JWT只是客戶端可以操作的客戶端令牌。這里沒有絕對的安全。JWT 由符號鍵保護,但不能自行失效。有效令牌在過期之前一直有效。這是JWT的一個缺陷(正如@TimBiegeleisen在評論中指出的那樣),令牌本身不能輕易失效。
如果用戶工作太久并被自動注銷,則您的JWT已過期,并且一切都很好。沒有麻煩,因為它自然耗盡,你沒有必要采取行動。
要使令牌失效,您需要使用 創建一個新令牌。這樣,下次您下次檢查JWT時,您看到它已過期。Expires = now.AddMinutes(-1)
用戶即使在注銷后也可以保存JWT并使用它的情況只能通過將JWT列入黑名單或偶爾維護某種其他類型的服務器端會話(這不起作用,即無狀態Web服務)來實現。
編輯:刪除了錯誤信息,并添加了使 JWT 失效(黑名單)的其他方法

千巷貓影
TA貢獻1829條經驗 獲得超7個贊
您可以簡單地兌現要撤銷的令牌,然后使您的身份驗證部分將已撤銷的請求與現金中的令牌進行比較,并基于該請求拒絕該請求
在代幣到期之前,現金應該知道代幣的重新開采時間,并兌現那么長時間
- 2 回答
- 0 關注
- 158 瀏覽
添加回答
舉報
0/150
提交
取消