.net core api Jwt認證與受權

認證與受權

認證是爲了驗證用戶是否合法,即驗證用戶的認證信息是否正確;受權是驗證已經過認證的用戶是否具備作某事的權限。咱們這裏採用JWT進行認證與受權。api

爲何要用JWT進行認證與受權?

一個完整的系統一般包含認證與受權,這樣只有提供正確認證信息且具備操做權限的用戶才能訪問該系統,從而實現了對系統的保護。數組

image.png

.NetCore Api 使用JWT體驗

生成一個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
image.png測試

請求http://localhost:5000/api/Values/(複製剛剛獲取的token)eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoicHdhaSIsImVtYWlsIjoicHdhaUBxcS5jb20iLCJzdWIiOiIxIiwiZXhwIjoxNjA2MDYyMTM4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjUwMDAiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjUwMDEifQ.quIqR-OBWXiPJ8r3myymrqztg5Bd1xyIfIl0P_Whuncui

同時在請求信息頭中加入http認證,當客戶端使用指定的認證方式,並提供正確的認證信息時,即在請求消息頭中添加Authorization項,此時再訪問該資源,服務器會對用戶提供的信息進行驗證。
bearer認知使用格式:
Authorization: Bearer <bearer_token>spa

發送請求,能夠查看到序列化token結果:
image.pngpwa

相關文章
相關標籤/搜索