如何在.NET 7中生成JWT令牌

问题描述 投票:0回答:2

由于 .NET 7 的 JWT 与之前的版本相比有一些变化。 我需要在 .NET 7 API 项目中生成和验证 JWT 令牌。 这样做是为了保护我通过 HTTP 客户端访问 API 的 WinForms 应用程序的 API 访问。

我的程序文件包含:

builder.Services.AddCors(options =>
{
    options.AddDefaultPolicy(
        policy =>
        {
            policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
        });
});

builder.Services.AddAuthentication().AddJwtBearer();

builder.Services.AddAuthorization();

我的appsettings.json包含

"Authentication": {
    "Schemes": {
      "Bearer": {
        "ValidAudiences": [
          "http://localhost:1851",
          "https://localhost:44328",
          "http://localhost:5078",
          "https://localhost:7134"
        ],
        "ValidIssuer": "dotnet-user-jwts",
      }
    }
  },

当我在项目文件夹中运行

dotnet user-jwts
命令时,以上设置是在我的 appsettings.development.json 文件中生成的。

我的问题是上面的命令生成用于开发的本地令牌并且工作正常。但我需要知道如何通过 C# 中的代码动态生成 JWT 令牌并在生产中使用它?

我在我的 API 项目中尝试过以下代码:

 var claims = new List<Claim>
                {
                    new Claim("Name", user.UserName),
                };
 var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_securityKey));
            var signinCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);
            var tokeOptions = new JwtSecurityToken(
                issuer: _config["Authentication:Schemes:Bearer:ValidIssuer"],
                audience: _config["Authentication:Schemes:Bearer:ValidAudiences:0"],
                claims: claims,
                expires: DateTime.Now.AddMinutes(50),
                signingCredentials: signinCredentials
            );
            var tokenString = new JwtSecurityTokenHandler().WriteToken(tokeOptions);

但是通过上述方法生成的令牌在授权时会出现 401 错误。

我刚刚从 appsettings.json 文件中删除了条目,并将它们添加到 Progrm.cs 中,如https://stackoverflow.com/a/74788946中所述,现在它正在工作

builder.Services.AddAuthentication().AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = "https://localhost:7134",
        ValidAudience = "https://localhost:7134",
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_securityKey))
    };
});
c# jwt .net-7.0
2个回答
3
投票

您可以尝试使用 Phoesion.DevJwt 生成/消费用于开发和 (系统) 测试的代币,不适用于生产

  1. 安装dotnet工具
dotnet tool install --global phoesion.devjwt.cli
  1. 使用生成令牌
dotnet devjwt create myApi --email [email protected]
  1. appsetting.Development.json
  2. 中配置
"Authentication": {
   "Schemes": {
      "Bearer": {
         "ValidAudience": "myApi",
         "ValidIssuer": "phoesion.devjwt",
         "SigningKeys": [
          {
             "Issuer": "phoesion.devjwt",
             "Value": "c29tZV9kZWZhdWx0X2tleV9mb3JfZGV2cw=="
          }
         ]
      }
   }
}

您现在可以使用该令牌来满足您的请求。

curl -i -H "Authorization: Bearer {token}" https://localhost:{port}/secret

以编程方式生成令牌

您可以使用

TokenGenerator
以编程方式生成令牌,如下所示:

var token = TokenGenerator.Create(audience, email, username)
                          .ExpiresIn(TimeSpan.FromDays(365))
                          .Build();

您还可以查看 控制台应用程序示例项目


披露:我是这个库的开发者


0
投票

这是完整的实现,如有任何疑问,请随时提出 https://github.com/ARULKUMAR0106/JWTTokenGeneration

© www.soinside.com 2019 - 2024. All rights reserved.