認證是爲了驗證用戶是否合法,即驗證用戶的認證信息是否正確;受權是驗證已經過認證的用戶是否具備作某事的權限。咱們這裏採用JWT進行認證與受權。api
一個完整的系統一般包含認證與受權,這樣只有提供正確認證信息且具備操做權限的用戶才能訪問該系統,從而實現了對系統的保護。數組
生成一個token令牌:服務器
[HttpGet] public ActionResult<IEnumerable<string>> Get() { // 簡單建立一個token令牌 // 建立聲明數組 var claims = new Claim[] { new Claim(ClaimTypes.Name, "pwai"), new Claim(JwtRegisteredClaimNames.Email, "pwai@qq.com"), new Claim(JwtRegisteredClaimNames.Sub, "1"),//主題subject,就是id uid }; // 實例化 token 對象 var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("winrtwinrtwinrtwinrt"));//至少16位密鑰 var token = new JwtSecurityToken( issuer: "http://localhost:5000", // 發行人,就是當前咱們項目 audience: "http://localhost:5001", // 訂閱,這是咱們須要哪一個項目去使用這個token claims: claims, expires: DateTime.Now.AddHours(1), signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256) ); // 生成token var jwtToken = new JwtSecurityTokenHandler().WriteToken(token); return new string[] { jwtToken }; }
開啓 Bearer 認證和註冊 JwtBearer :app
public void ConfigureServices(IServiceCollection services) { // 把JwtSecurityTokenn進行清除,net core禁止他進行配置映射JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); // 認證邏輯要與前面的生成token令牌的邏輯同樣 var symmetricKeyAsBase64 = "winrtwinrtwinrtwinrt"; var keyByteArray = Encoding.ASCII.GetBytes(symmetricKeyAsBase64); var signingKey = new SymmetricSecurityKey(keyByteArray); var tokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = signingKey, ValidateIssuer = true, ValidIssuer = "http://localhost:5000",//發行人 ValidateAudience = true, ValidAudience = "http://localhost:5001",//訂閱人 ValidateLifetime = true, ClockSkew = TimeSpan.FromSeconds(30), RequireExpirationTime = true, }; services.AddAuthentication("Bearer") .AddJwtBearer(o => { o.TokenValidationParameters = tokenValidationParameters; }); }
開啓受權中間件:ide
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { //方法上下文省略了其餘中間件 app.UseAuthentication(); }
獲取token令牌:post
[HttpGet("{jwtStr}")] [Authorize] //受權 public ActionResult<IEnumerable<string>> Get(string jwtStr) { // 獲取token內容的方法 // 方法一 var jwtHandler = new JwtSecurityTokenHandler(); JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(jwtStr); // 方法二 var sub = User.FindFirst(d => d.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name")?.Value; // 方法三 var name = _accessor.HttpContext.User.Identity.Name; var claims= _accessor.HttpContext.User.Claims; var claimTypeVal= (from item in claims where item.Type == JwtRegisteredClaimNames.Email select item.Value).ToList(); return new string[] { JsonConvert.SerializeObject(jwtToken), sub, name, JsonConvert.SerializeObject(claimTypeVal) }; }
使用postman測試:
請求http://localhost:5000/api/Values/ ,獲取token
測試
請求http://localhost:5000/api/Values/(複製剛剛獲取的token)eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoicHdhaSIsImVtYWlsIjoicHdhaUBxcS5jb20iLCJzdWIiOiIxIiwiZXhwIjoxNjA2MDYyMTM4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjUwMDAiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjUwMDEifQ.quIqR-OBWXiPJ8r3myymrqztg5Bd1xyIfIl0P_Whuncui
同時在請求信息頭中加入http認證,當客戶端使用指定的認證方式,並提供正確的認證信息時,即在請求消息頭中添加Authorization項,此時再訪問該資源,服務器會對用戶提供的信息進行驗證。
bearer認知使用格式:Authorization: Bearer <bearer_token>
spa
發送請求,能夠查看到序列化token結果:
pwa