添加身份认证和鉴权方案-使用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主机是两件事,不一定要全部都做。

posted @ 2024-04-30 22:50  ggtc  阅读(19)  评论(0编辑  收藏  举报
//右下角目录