认证与授权
认证是为了验证用户是否合法,即验证用户的认证信息是否正确;授权是验证已通过认证的用户是否具有做某事的权限。我们这里采用JWT进行认证与授权。
为什么要用JWT进行认证与授权?
一个完整的系统通常包含认证与授权,这样只有提供正确认证信息且具有操作权限的用户才能访问该系统,从而实现了对系统的保护。
使用cookie与token的区别:
https://www.jianshu.com/p/ce9...
.NetCore Api 使用JWT体验
生成一个token令牌:
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
// 简单创建一个token令牌
// 创建声明数组
var claims = new Claim[]
{
new Claim(ClaimTypes.Name, "pwai"),
new Claim(JwtRegisteredClaimNames.Email, "pwai@qq.com"),
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<IEnumerable<string>> 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/Val... ,获取token
请求http://localhost:5000/api/Val...
同时在请求信息头中加入http认证,当客户端使用指定的认证方式,并提供正确的认证信息时,即在请求消息头中添加Authorization项,此时再访问该资源,服务器会对用户提供的信息进行验证。
bearer认知使用格式:Authorization: Bearer <bearer_token>
发送请求,可以查看到序列化token结果:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。