.net core api介面JWT方式認證Token
阿新 • • 發佈:2021-12-15
一、專案>管理Nuget包 安裝
二、.appsettings.on新增
"JWT": {
"Secret": "~!@#$%^&*()_+qwertyuiopasldkh[o51485421ajshk^%*)kasd",// 金鑰
"Issuer": "kfjdhf",// 頒發者
"Audihttp://www.cppcns.comence": "kfjdhf",// 接收者
//"Expired": 30 // 過期時間(30min)
}
三、ConfigureServices注入jwt
#region 註冊JWT //獲取配置檔案 var JWTConfig = Configuration.GetSection("JWT"); //生成金鑰 var symmetricKeyAsBase64 = JWTConfig.GetValue<string>("Secret"); var keyByteArray = Encoding.ASCII.GetBytes(symmetricKeyAsBase64); var signingKey = new SymmetricSecurityKey(keyByteArray); //認證引數 services.AddAuthentication("Bearer") .AddJwtBearer(o => { o.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true,//是否驗證簽名,不驗證的畫可以篡改資料,不安全 IssuerSigningKey = signingKey,//解密的金鑰 ValidateIssuer = true,//是否驗證發行人,就是驗證載荷中的Iss是否對應ValidIssuer引數 ValidIssuer = JWTConfig.GetValue<string>("Iss"),//發行人 ValidateAudience = true,//是否驗證訂閱人,就是驗證載荷中的Aud是否對應ValidAudience引數 ValidAudience = JWTConfig.GetValue<string>("Aud"),//訂閱人 ValidateLifetime = true,//是否驗證過期時間,過期了就拒絕訪問 ClockSkew = TimeSpan.Zero,//這個是緩衝過期時間,也就是說,即使我們配置了過期時間,這裡也要考慮進去,過期時間+緩衝,預設好像是7分鐘,你可以直接設定為0 RequireExpirationTime = true,}; }); #endregion
(2).Configure啟用
app.UseAuthentication();//jwt
四、建立jwt幫助類
using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Text; namespace SystemAPi.JWT { public class JwtHelper { public JwtHelper(IConfiguration configuration) { Configuration = configuration; } /// <summary> /// 配置屬性 WHfndfiaoB/// </summary> public IConfiguration Configuration { get; } /// <summary> /// 生成Token /// </summary> /// <returns></returns> public string GenerateToken(List<Claim> claims) { var jwtConfig = Configuration.GetSection("Jwt"); //祕鑰,就是標頭,這裡用Hmacsha256演算法,需要256bit的金鑰 var securityKey = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtConfig.GetValue<string>("Secret"))),SecurityAlgorithms.HmacSha256); //Claim,JwtRegisteredClaimNames中預定義了好多種預設的引數名,也可以像下面的Guid一樣自己定義鍵名. //ClaimTypes也預定義了好多型別如role、email、name。Role用於賦予許可權,不同的角色可以訪問不同的介面 //相當於有效載荷 List<Claim> baseClaims = new List<Claim>{ new Claim(JwtRegisteredClaimNames.Iss,jwtConfig.GetValue<string>("Issuer")),new Claim(JwtRegisteredClaimNames.Aud,jwtConfig.GetValue<string>("Audience")),new Claim("Guid",Guid.NewGuid().ToString("D")),new Claim(ClaimTypes.Role,"admin"),}; claims = claims.Union<Claim>(baseClaims).ToList<Claim>();//合併Claim,刪除重複專案 SecurityToken securityToken = new JwtSecurityToken( signingCredentials: securityKey,expires: DateTime.Now.AddDays(1),//過期時間 claims: claims ); //生成jwt令牌 return new JwtSecurityTokenHandler().WriteToken(securityToken); } } }
五、測試登入成功把賬戶資訊存進token
/// 登入 /// </summary> /客棧// <returns>登入</returns> [HttpGet] public ReturnJson login(string name,string pwd) { User data = bll.login(name,pwd); if (data!=null) { if (data.name == name && data.password == pwd) { List<Claim> claims = new List<Claim>() { new Claim(ClaimTypes.NameIdentifier,data.name),data.AdminId.ToString()),new Claim("AdminRole",data.AdminId.ToString()) }; string token=jwtHelper.GenerateToken(claims); return new ReturnJson<string>().Success(token); }; } return new ReturnJson().Fail(); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。