1. 创建好项目,添加一个控制器,新建用户登录api接口和接收用户登录信息类Dto
Dto就包含两个字段,账号和密码
2. 安装NuGet包,搜索JWT,安装图下这个包
3. 在appsettings.json添加JWT加密需要的私钥,发布者等相关配置信息,私钥用户可以自定义。
私钥:SecretKey
发布者:Issuer
接收者:Audience
"Authentication": {
"SecretKey": "nadjhfgkadshgoihfkajhkjdhsfaidkuahfhdksjaghidshyaukfhdjks",
"Issuer": "www.adsfsadfasdf",
"Audience": "www.adsfsadfasdf"
}
4. 生成JWT,存放用户信息,上篇文章我们基本认识解析了JWT,JWT分为三部分:
- 标头(Header):有令牌的类型和所使用的签名算法,如HMAC、SHA256、RSA,用于加密Signature,使用Base64编码组成。
- 有效载荷(Payload):存放用户信息,用户id,权限等,不不放用户敏感的信息,如密码,使用Base64编码组成。
- 签名(Signature):使用编码后的header和payload
加上我们提供的一个密钥,使用header中指定的签名算法(HS256)进行签名加密。
using JWTDemo.Dtos;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
namespace JWTDemo.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class AuthenticationController : ControllerBase
{
public readonly IConfiguration _configuration;
public AuthenticationController(IConfiguration configuration)
{
_configuration=configuration;
}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginDto loginDto)
{
var signingAlogorithm = SecurityAlgorithms.HmacSha256;
var claims = new []
{
new Claim(JwtRegisteredClaimNames.Sub,"user_id")
};
var secretByte = Encoding.UTF8.GetBytes(_configuration["Authentication:SecretKey"]);
var signingKey = new SymmetricSecurityKey(secretByte);
var signingCredentials=new SigningCredentials(signingKey, signingAlogorithm);
var Token=new JwtSecurityToken(
issuer: _configuration["Authentication:Issuer"],
audience: _configuration["Authentication:Audience"],
claims: claims,
notBefore: DateTime.UtcNow,
expires:DateTime.UtcNow.AddDays(1),
signingCredentials
);
var TokenStr=new JwtSecurityTokenHandler().WriteToken(Token);
return Ok(TokenStr);
}
}
}
取出用户信息用
var id = HttpContext.User.Claims.First(c => c.Type == "user_id");
5. 启动项目,测试接口,生成token成功
6. 在Program.cs注入JWT身份认证服务,下面代码均有注释
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
var secretByte = Encoding.UTF8.GetBytes(builder.Configuration["Authentication:SecretKey"]);
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidIssuer = builder.Configuration["Authentication:Issuer"],
ValidateAudience = true,
ValidAudience = builder.Configuration["Authentication:Audience"],
ValidateLifetime = true,
IssuerSigningKey = new SymmetricSecurityKey(secretByte)
};
});
app.UseAuthentication();
app.UseAuthorization();
7. 给api加上授权保护,新建一个测试api,在api上面添加[Authorize]
[HttpGet("test")]
[Authorize]
public IActionResult test()
{
return Ok("test");
}
8.测试接口
没登陆获取到Token,直接请求失败,返回401
登录一下获取到token加到Headers上注意bearer后面有个空格分开,才加上token:
KEY:Authorization
VALUE:bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyX2lkIiwibmJmIjoxNjQ5MzQ0MDY0LCJleHAiOjE2NDk0MzA0NjQsImlzcyI6Ind3dy5hZHNmc2FkZmFzZGYiLCJhdWQiOiJ3d3cuYWRzZnNhZGZhc2RmIn0.-yNVFtme3LzmAJFCcBSjN-DX7w_dZSpmGdrHlo7bXxc
请求成功:
9.登录成功后给用户添加权限
在之前登录生成JWT的api方法里,我们在JWT的Payload给用户添加一个权限名称信息,new Claim(ClaimTypes.Role,“admin”)
10.给api接口添加权限
[Authorize(Roles =“admin”)],权限为admin用户才能访问
[HttpGet("test")]
[Authorize(Roles ="admin")]
public IActionResult test()
{
return Ok("test");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)