JWT(JSON Web Token)是目前比较流行的跨域身份认证解决方案,关于jwt原理在这里不做详细说明了,网上的介绍非常多,这里我只演示如何在.net core 2.0 中如何使用它。
1、在nuget中搜索JWT,并将其安装在你需要的程序集中。
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、好了,我们可以进行测试了,这里我使用的是swagger
在响应体中我们已经看到了我们生成的token,接下来就是如何使用和校验它了。
1、客户端请求时,需要将token放到header中,注意的是 Authorization: Bearer+' '+token。
2、下面将处理服务端获取用户ID。
private readonly IHttpContextAccessor _httpContextAccessor;
public UserSession(
IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
上面为构造函数,依赖注入 _httpContextAccessor。
public async Task<int?> 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