由于 .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))
};
});
您可以尝试使用 Phoesion.DevJwt 生成/消费用于开发和 (系统) 测试的代币,不适用于生产。
dotnet tool install --global phoesion.devjwt.cli
dotnet devjwt create myApi --email [email protected]
appsetting.Development.json
"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();
您还可以查看 控制台应用程序示例项目
披露:我是这个库的开发者
这是完整的实现,如有任何疑问,请随时提出 https://github.com/ARULKUMAR0106/JWTTokenGeneration