.net core api Jwt认证与授权

认证与授权

认证是为了验证用户是否合法,即验证用户的认证信息是否正确;授权是验证已通过认证的用户是否具有做某事的权限。我们这里采用JWT进行认证与授权。

为什么要用JWT进行认证与授权?

一个完整的系统通常包含认证与授权,这样只有提供正确认证信息且具有操作权限的用户才能访问该系统,从而实现了对系统的保护。

.net core api Jwt认证与授权_第1张图片

.NetCore Api 使用JWT体验

生成一个token令牌:

        [HttpGet]
        public ActionResult> Get()
        {
            // 简单创建一个token令牌

            // 创建声明数组
            var claims = new Claim[]
           {
                new Claim(ClaimTypes.Name, "pwai"),
                new Claim(JwtRegisteredClaimNames.Email, "[email protected]"),
                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 :

 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;
             });
        }

开启授权中间件:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            //方法上下文省略了其他中间件
            
            app.UseAuthentication();
        }

获取token令牌:

  [HttpGet("{jwtStr}")]
        [Authorize] //授权
        public ActionResult> 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
.net core api Jwt认证与授权_第2张图片

请求http://localhost:5000/api/Values/(复制刚刚获取的token)eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoicHdhaSIsImVtYWlsIjoicHdhaUBxcS5jb20iLCJzdWIiOiIxIiwiZXhwIjoxNjA2MDYyMTM4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjUwMDAiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjUwMDEifQ.quIqR-OBWXiPJ8r3myymrqztg5Bd1xyIfIl0P_Whunc

同时在请求信息头中加入http认证,当客户端使用指定的认证方式,并提供正确的认证信息时,即在请求消息头中添加Authorization项,此时再访问该资源,服务器会对用户提供的信息进行验证。
bearer认知使用格式:
Authorization: Bearer

发送请求,可以查看到序列化token结果:
.net core api Jwt认证与授权_第3张图片

你可能感兴趣的:(.netcore,jwt)