引入NuGet包JwtBearer
模拟登陆方法:
[HttpPost("login")]
public IActionResult login([FromBody]LoginDto loginDto)
{
//创建JWT
//header
var signingAlgorithm = SecurityAlgorithms.HmacSha256;
//payload
var claims = new[]
{
//sub/id
new Claim(JwtRegisteredClaimNames.Sub,"moniID"),
new Claim(ClaimTypes.Role,"Admin"),
new Claim(ClaimTypes.Name,"张三")
};
//signiture 需要使用到私钥
var secretByte = Encoding.UTF8.GetBytes(_configuration["Authentication:SecreKey"]);
var signingKey = new SymmetricSecurityKey(secretByte);
var signingCredentials = new SigningCredentials(signingKey, signingAlgorithm);
var token = new JwtSecurityToken(
issuer: "JWTdemo.com",
audience: "JWTdemo.com",
claims,
notBefore: DateTime.UtcNow,
expires: DateTime.UtcNow.AddDays(1),
signingCredentials
);
var tokenstring = new JwtSecurityTokenHandler().WriteToken(token);
return Ok(tokenstring);
}
返回的token可以在客户端保存,在之后的每次请求服务器资源中在header携带token:此处用postman实例:
在start up类中增加身份认证服务:
var audienceConfig = Configuration.GetSection("Audience");
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Authentication:SecreKey"]));
var tokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = signingKey, //自定义的私钥,存放在服务器
ValidateIssuer = true,
ValidIssuer = "JWTdemo.com", //发布者
ValidateAudience = true,
ValidAudience = "JWTdemo.com", //对谁发布
ValidateLifetime = true, //设置token是否过期
ClockSkew = TimeSpan.Zero,
RequireExpirationTime = true,
};
//注入Jwt验证
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = tokenValidationParameters;
});
在需要使用到token请求的资源上加上身份认证声明,此处用一个获得一个字符串的action实例:
[HttpGet("getstring")]
[Authorize(Roles = "Admin")]
public string getstring([FromQuery] string name)
{
return "带土";
}
[Authorize(Roles = "Admin")]加上(Roles = "Admin")指在登录时claim声明中角色为Admin的用户才能够请求,若不加上则所有用户都能够请求