浅谈ASP.NET Core 中jwt授权认证的流程原理

2020-03-19 16:03:24王振洲

1,快速实现授权验证

什么是 JWT ?为什么要用 JWT ?JWT 的组成?

这些百度可以直接找到,这里不再赘述。

实际上,只需要知道 JWT 认证模式是使用一段 Token 作为认证依据的手段。

我们看一下 Postman 设置 Token 的位置。

那么,如何使用 C# 的 HttpClient 访问一个 JWT 认证的 WebAPI 呢?

下面来创建一个 ASP.NET Core 项目,尝试添加 JWT 验证功能。

1.1 添加 JWT 服务配置

在 Startup.cs 的 ConfigureServices 方法中,添加一个服务

  // 设置验证方式为 Bearer Token
   // 你也可以添加 using Microsoft.AspNetCore.Authentication.JwtBearer;
   // 使用 JwtBearerDefaults.AuthenticationScheme 代替 字符串 "Brearer"
   services.AddAuthentication("Bearer")
    .AddJwtBearer(options =>
    {
     options.TokenValidationParameters = new TokenValidationParameters
     {
      ValidateIssuerSigningKey = true,
      IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("abcdABCD1234abcdABCD1234")), // 加密解密Token的密钥

      // 是否验证发布者
      ValidateIssuer = true,
      // 发布者名称
      ValidIssuer = "server", 

      // 是否验证订阅者
      // 订阅者名称
      ValidateAudience = true,
      ValidAudience = "client007",

      // 是否验证令牌有效期
      ValidateLifetime = true,
      // 每次颁发令牌,令牌有效时间
      ClockSkew = TimeSpan.FromMinutes(120)
     };
    });

修改 Configure 中的中间件

app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();  // 注意这里
app.UseAuthorization();

就是这么简单,通过以上设置,要求验证请求是否有权限。

1.2 颁发 Token

颁发的 Token ,ASP.NET Core 不会保存。

ASP.NET Core 启用了 Token 认证,你随便将生成 Token 的代码放到不同程序的控制台,只要密钥和 Issuer 和 Audience 一致,生成的 Token 就可以登录这个 ASP.NET Core。

也就是说,可以随意创建控制台程序生成 Token,生成的 Token 完全可以登录 ASP.NET Core 程序。

至于原因,我们后面再说,

在 Program.cs 中,添加一个这样的方法

  static void ConsoleToke()
  {

   // 定义用户信息
   var claims = new Claim[]
   {
    new Claim(ClaimTypes.Name, "痴者工良"),
    new Claim(JwtRegisteredClaimNames.Email, "66666666666@qq.com"),
   };

   // 和 Startup 中的配置一致
   SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("abcdABCD1234abcdABCD1234"));

   JwtSecurityToken token = new JwtSecurityToken(
    issuer: "server",
    audience: "client007",
    claims: claims,
    notBefore: DateTime.Now,
    expires: DateTime.Now.AddMinutes(30),
    signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
   );

   string jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
   Console.WriteLine(jwtToken);
  }