南宁建网站必荐云尚网络,网站建设知识平台,工商局网站清算组备案怎么做,网站开发语言市场有率微信公众号#xff1a;趣编程ACE关注可了解.NET日常开发技巧。如需源码#xff0c;请公众号留言 源码;**[如果您觉得本公众号对您有帮助#xff0c;欢迎下方扫码加入群聊]鉴权、授权专题之简易鉴权我记得作为实习生去公司上班的时候#xff0c;领导就直接让我熟悉注册、登录… 微信公众号趣编程ACE关注可了解.NET日常开发技巧。如需源码请公众号留言 源码;**[如果您觉得本公众号对您有帮助欢迎下方扫码加入群聊]鉴权、授权专题之简易鉴权我记得作为实习生去公司上班的时候领导就直接让我熟悉注册、登录逻辑emm 用他的话来说就是这部分跟业务关联性不是很大你先看看。。。登录注册是跟业务逻辑不咋挂钩但是对框架得熟悉呀好吧自此咱就开始了搬砖路咯~安装需要的Nuget包1System.IdentityModel.Tokens.Jwt
2
3Microsoft.AspNetCore.Authentication
4
5Microsoft.AspNetCore.Authentication.JwtBearerSystem.IdentityModel.Tokens.Jwt 包含了用于提供创建、序列化、验证Json Web Token的一些类型Microsoft.AspNetCore.Authentication 一个用来各种身份验证中间件的Asp.Net Core的基本类型Microsoft.AspNetCore.Authentication.JwtBearer 这是一个能接受Token的中间件新建一个基于.Net6 的web api项目前言1public interface IAuthenticate
2{
3 string Login(string userName,string password); // 包含一个登录方法
4}创建一个IAuthenticate的接口里面包含一个登录方法,接着便创建一个实现类实现Login方法与此同时我们需要将这个接口服务在容器里面依赖注入一下。1public class AuthenticateImpl : IAuthenticate
2{
3 public string Login(string userName, string password)
4 {
5 .....
6 };
7}1// Program.cs 文件里面依赖注入
2builder.Services.AddSingletonIAuthenticate(new AuthenticateImpl(key));我们知道在登录逻辑里面我们需要对传递过来的用户名和密码在数据库里面check一下只有真真实实存在这个用户我们才会创建并分发Token。在这里我为了节省代码模拟一下check逻辑1private readonly IDictionarystring,string users new Dictionarystring,string
2{
3 {person1,aaaaa},
4 {person2,bbbbb},
5};定义一个用户字典key为用户名value为密码 此处不考虑密码编码加密一切从简。接着开始登录验证。。。。1public string Login(string userName, string password)
2{
3 // check 用户真实存在
4 if(!users.Any(uu.KeyuserName u.Valuepassword))
5 {
6 return null;
7 }
8 // 在验证用户成功后开始创建Token
9}创建Token1public string Login(string userName, string password)2{3 // check 用户真实存在 4 if(!users.Any(uu.KeyuserName u.Valuepassword))5 {6 return null;7 }8 // 创建Token9 var tokenHandle new JwtSecurityTokenHandler(); // 实例化一个 JwtSecurityTokenHandler 对象
10 var tokenKey Encoding.ASCII.GetBytes(_key);
11 var tokenDescriptor new SecurityTokenDescriptor
12 {
13 Subject new ClaimsIdentity(new Claim[]
14 {
15 new Claim(ClaimTypes.Name,userName)
16 }),
17 Expires DateTime.UtcNow.AddHours(1),
18 SigningCredentials new SigningCredentials(
19 new SymmetricSecurityKey(tokenKey),
20 SecurityAlgorithms.HmacSha256Signature)
21 };
22 var token tokenHandle.CreateToken(tokenDescriptor);
23 return tokenHandle.WriteToken(token);
24}详解 首先我们需要实例化一个JwtSecurityTokenHandler 对象这个对象呢提供了创建Token的方法其中一个就是WriteToken()这个方法此方法入参是一个SecurityToken对象那么如何创建这个SecurityToken对象呢从上述代码的22行可以看出利用CreateToken()这个方法可以实现而这个方法又需要一个SecurityTokenDescriptor对象。所以我们将目光移至11行自此就是一个生成Token的全部过程。开启中间件鉴权1// Asp.net core 内置的鉴权方案2builder.Services.AddAuthentication(x3{4 x.DefaultAuthenticateScheme JwtBearerDefaults.AuthenticationScheme; // 默认是Bearer 方案5 x.DefaultChallengeScheme JwtBearerDefaults.AuthenticationScheme;6}).AddJwtBearer(x7{8 x.RequireHttpsMetadata false;9 x.SaveToken true;
10 x.TokenValidationParameters new TokenValidationParameters
11 {
12 ValidateIssuerSigningKey true,
13 IssuerSigningKey new SymmetricSecurityKey(Encoding.ASCII.GetBytes(key)),
14 ValidateIssuer false,
15 ValidateAudience false
16 };
17});
18
19app.UseAuthentication(); // 使用鉴权接口访问我们在Api控制器上加上[Authorize()]特性这样整个控制器都需要经过token验证除非接口上面有[AllowAnonymous]特性修饰1[Authorize()]
2[ApiController]
3[Route(api/[controller])]
4public class TestJwtController : ControllerBase
5{
6...
7}对于登录接口1[AllowAnonymous]2[HttpPost(login)]3public IActionResult Login(User user)4{5 // 根据用户名和密码验证用户并生成Token6 var token _authenticate.Login(user?.UserName,user?.Password);7 if(token is null)8 {9 return Unauthorized(); // 返回401
10 }
11 return Ok(token); // 返回token 登录成功
12}