Asp.Net Core 2.0 之旅--使用JWT做登录认证授权

JWT(JSON Web Token)是目前比较流行的跨域身份认证解决方案,关于jwt原理在这里不做详细说明了,网上的介绍非常多,这里我只演示如何在.net core 2.0 中如何使用它。

1、在nuget中搜索JWT,并将其安装在你需要的程序集中。

Asp.Net Core 2.0 之旅--使用JWT做登录认证授权_第1张图片

2、在Startup类中的ConfigureServices方法中配置JWT

            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuer = true,//是否验证Issuer
                        ValidateAudience = true,//是否验证Audience
                        ValidateLifetime = true,//是否验证失效时间
                        ValidateIssuerSigningKey = true,//是否验证SecurityKey
                        ValidAudience = "yourdomain.com",//Audience
                        ValidIssuer = "yourdomain.com",//Issuer,这两项和前面签发jwt的设置一致
                        ClockSkew= TimeSpan.Zero,//校验时间是否过期时,设置的时钟偏移量
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["SecurityKey"])),//拿到SecurityKey
                    };
                });

3、在Configure方法中启用JWT

    app.UseAuthentication();

4、经如上配置完成后,你就可以在项目中使用JWT做认证授权了

            var user = await _userManager.GetUserByUserNameAndPwd(request.Username, request.Password);//根据用户密码获取用户信息
            if (user == null) { return Json(new MsgDto {Msg = "用户名或密码错误",Success=false }); }
            var claims = new[]{new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()) };//创建声明
            var now = DateTime.Now;
            var ex = now + TimeSpan.FromMinutes(30);//过期时间设置为30分钟
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["SecurityKey"]));//获取密钥
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);//加密方式
            var token = new SecurityTokenDescriptor
            {
                Issuer = "yourdomain.com",
                Audience = "yourdomain.com",
                Expires = ex,
                IssuedAt = now,
                SigningCredentials = creds,
                Subject = new ClaimsIdentity(claims)
            };
            return Json(new MsgDto
            {
                Data = new { token = new JwtSecurityTokenHandler().CreateEncodedJwt(token) },//生成TOKEN
                Success = true
            });

5、好了,我们可以进行测试了,这里我使用的是swaggerAsp.Net Core 2.0 之旅--使用JWT做登录认证授权_第2张图片

Asp.Net Core 2.0 之旅--使用JWT做登录认证授权_第3张图片

在响应体中我们已经看到了我们生成的token,接下来就是如何使用和校验它了。

1、客户端请求时,需要将token放到header中,注意的是 Authorization: Bearer+' '+token。

Asp.Net Core 2.0 之旅--使用JWT做登录认证授权_第4张图片

 2、下面将处理服务端获取用户ID。

        private readonly IHttpContextAccessor _httpContextAccessor;
        public UserSession(
            IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }

上面为构造函数,依赖注入 _httpContextAccessor。

        public async Task GetCurrUserIdAsync()
        {
            var auth = await _httpContextAccessor.HttpContext.AuthenticateAsync();//获取登录用户的AuthenticateResult
            if (auth.Succeeded)
            {
                var userCli = auth.Principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier); //在声明集合中获取ClaimTypes.NameIdentifier 的值就是用户ID
                if (userCli == null || string.IsNullOrEmpty(userCli.Value))
                {
                    return null;
                }
                return Convert.ToInt32(userCli.Value);
            }
            return null;
        }

 3、我们已经完整的演示了jwt的完整校验过程,其中还有很多细节没有写出来,如果在net core 感兴趣的,请加群599063383

 

你可能感兴趣的:(NET,CORE)