十年河東,十年河西,莫欺少年窮
學無止境,精益求精
之前寫過 MVC webApi 的Jwt Token驗證方式,博客地址為:JSON WEB TOKEN,簡單談談TOKEN的使用及在C#中的實現
netCore JWT認證比較好的一篇博客如下:https://www.cnblogs.com/liuww/p/12177272.html
由於Net升級過快,不得不溫故而知新,因此才有這篇博客的誕生
首先關於JWT Token是什么,它是如何進行工作的,又是如何結合WebApi的,這些問題都可以盡情參考鄙人之前的博客。也就是上述的鏈接地址。
今天由於時間原因,暫時不寫具體的實現,僅僅提供netCore Token的生成方法。
如下:
public class Contanst { /// <summary> /// This is a private key for Server /// //這個是生成Token時,服務端加密秘鑰 屬於私鑰 /// </summary> public const string JwtSecurityKey = "Movit-Tech"; }
當然,這個密鑰也可以寫在配置文件中。
用戶基本信息類
public class UserInfoModel { public string userId { get; set; } = Guid.NewGuid().ToString(); public string userSex { get; set; } = "男"; public string userPhone { get; set; } = "18137070152"; public string userAccount { get; set; } = "chenwolong"; public string userName { get; set; } = "陳卧龍"; public string userCompany { get; set; } = "盟拓軟件(蘇州)有限公司"; public string userRole { get; set; } = "SuperAdmin"; /* 等等其他屬性 */ }
這里簡單介紹下Token的使用,個人理解,主要分為以下幾個步驟
1、用戶請求登錄驗證WebApi接口,該接口用於驗證用戶的登錄賬戶及密碼,如果通過驗證,返回給用戶一個Token
2、用戶拿到Token后,將Token放在Http請求頭中,請求其他有權限限制的接口。在這里,我們可以把Token理解為令牌,未持有令牌的請求,是不被允許的。
3、用戶獲得的Token令牌有一定的時效,過期后,需要重新驗證登錄接口,待登錄驗證通過后,服務器會返回用戶新的令牌。用戶攜帶新的令牌進行接口請求。
OK,大致過程就是這樣,權限控制更完善的做法是:Token中存放的信息結合數據庫,Redis等存儲的數據,返回用戶可訪問接口列表或其他數據、功能權限。
NetCore生成Token的方法如下:

using Microsoft.IdentityModel.Tokens; using NetCoreCommon; using NetCoreModels; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; namespace NetCoreTokenApi { public class TokenHelper { public string GetToken(UserInfoModel user) { var key = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(Contanst.JwtSecurityKey)); var claims = new Claim[] { new Claim(ClaimTypes.Name,user.userAccount), new Claim(ClaimTypes.NameIdentifier,user.userId), new Claim(ClaimTypes.Role,user.userRole), new Claim(ClaimTypes.Actor,user.userName), }; var expires = DateTime.Now.AddHours(12);//生命周期 12小時 var token = new JwtSecurityToken( issuer: user.userName,//非必須。issuer 請求實體,可以是發起請求的用戶的信息, audience: "http://example.com",//非必須。接收該JWT的一方。 claims: claims, notBefore: DateTime.Now, expires: expires, signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)); //生成Token string jwtToken = new JwtSecurityTokenHandler().WriteToken(token); return jwtToken; } } }
時間原因,今天僅實現Token的生成,不結合接口進行相關測試。將來有時間了,會繼續完善。
未完待續...
@天才卧龍的博客