添加身份认证和鉴权方案-使用jwtbearer
HTTP身份认证框架
RFC 7235 定义了一个 HTTP 身份验证框架,服务器可以用来质询(challenge)客户端的请求,客户端则可以提供身份验证凭据。
服务端开启了身份认证后。如果客户端访问未授权的接口,服务器端会向客户端返回 401
(Unauthorized,未被授权的)响应状态码,并在 WWW-Authenticate
响应标头提供如何进行验证的信息,其中至少包含有一种质询方式。
标头的语法如下
WWW-Authenticate: <type> realm=<realm>
在这里,<type>
指的是验证的方案(“Basic”是最常见的验证方案)。realm 用来描述进行保护的区域,或者指代保护的范围(相当于一个角色)
要正常访问,就要添加身份认证标头
Authorization: <type> <credentials>
<type>指的是身份认证框架使用的身份认证方案,比如basic 参见 RFC 7617,base64 编码凭据。“Basic”HTTP 验证方案是在 RFC 7617 中规定的,在该方案中,使用用户的 ID/密码作为凭据信息,并且使用 base64 算法进行编码,以明文的形式在网络中进行传输的。
<credentials>如果是basic验证,在前端就用js生成就行,如果是bearer,一般是请求后端的登录接口获取,或者是问后端人员要一个。
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
在这个示例中,QWxhZGRpbjpvcGVuIHNlc2FtZQ==
是用户名和密码经过 Base64 编码后的结果。这个字符串的解码结果是 Aladdin:open sesame。Aladdin是用户名,open sesame是密码。
bearer 参见 RFC 6750,bearer 令牌通过 OAuth 2.0 保护资源
Authorization: bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Ind3dy5iZWpzb24uY29tIiwic3ViIjoiZGVtbyIsImlhdCI6MTcxNDQ0NjQ0MiwibmJmIjoxNzE0NDQ2NDQyLCJleHAiOjE3MTQ1MzI4NDJ9.8bg2jMRwkbSoEkLZrjoko4zREFjxmkHPOrTCdTkOwK8
这个例子解密如下
如果没有该标头的话,会报401错误,并提示你应该使用的身份认证方案
web主机配置身份认证
web主机中配置
1 builder.Services.AddAuthentication(option => 2 { 3 //添加一个使用 JwtBearer 身份验证作为默认的身份验证方案,不是这里开启了身份认证 4 option.DefaultAuthenticateScheme= JwtBearerDefaults.AuthenticationScheme; 5 option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; 6 }).AddJwtBearer(option => 7 { 8 option.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters 9 { 10 ValidIssuer = "颁发机构", 11 ValidAudience = "申请者", 12 //ValidateLifetime=true,//验证失效时间,默认就是true 13 ClockSkew=TimeSpan.FromSeconds(0),//将token的失效时间延长,默认是5分钟 14 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("1234567890123456颁发者数字签名"))//最小16位 15 }; 16 }); 17 //添加授权策略,不指定策略,使用默认策略时,可注释 18 //builder.Services.AddAuthorization(option => 19 //{ 20 // // 这里可以定义多个策略 21 // //option.AddPolicy("DefaultPolicy", policy => 22 // //{ 23 // // policy.RequireAuthenticatedUser();// 要求用户认证 24 // //}); 25 //}); 26 builder.Services.AddControllers(option => 27 { 28 //给控制器应用授权策略(过时的方式,现在推荐使用端点路由授权) 29 //option.Filters.Add(new AuthorizeFilter()); 30 }); 31 32 var app = builder.Build(); 33 34 //开启身份验证。对于授权不是必须的,如果不使用HttpContext.User,可注释。如果验证成功,处理程序将创建一个表示用户身份的ClaimsPrincipal对象,并将其设置为当前HTTP上下文的用户(HttpContext.User),否则返回401 35 //app.UseAuthentication(); 36 //开启授权。必须在身份验证之后。启用授权组件[Authorize]。但是对于使用过滤器的方式授权,此中间件不需要也可以 37 app.UseAuthorization(); 38 //推荐使用的全局授权方式。使用请求端点路由的方式授权,不指定具体授权策略时会使用默认策略 39 app.MapControllers().RequireAuthorization(); 40 41 app.Run();
Authorization表头需要的token生成
1 Claim[] claim = new Claim[] { 2 new Claim(ClaimTypes.Name,"zzz"), 3 new Claim("testdepart","testdepart"), 4 new Claim("自定义字段","testdepart") 5 }; 6 var token = new JwtSecurityToken( 7 issuer: "颁发机构", 8 audience: "申请者", 9 claims: claim, 10 notBefore: DateTime.Now, 11 expires: DateTime.Now.AddMinutes(1), 12 signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes("1234567890123456颁发者数字签名")), SecurityAlgorithms.HmacSha256)); 13 string jwttoken=new JwtSecurityTokenHandler().WriteToken(token);
注意的事项:身份验证和授权在前端请求看来是一件事,就是添加一个Authorization标头,但对于后端web主机是两件事,不一定要全部都做。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?