jwt - 授权属性为asp.net核心中的控制器授权任何JWT令牌?
问题描述
我正在尝试在我的 ASP.NET CORE 项目中使用JWT身份验证。
Step-1:我在Starup.cs文件的ConfigureServices方法中添加了 JWT 服务。
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"])),
RequireExpirationTime = true,
ValidateLifetime = true,
ValidateAudience = false,
ValidateActor = false,
ValidateIssuer = false
};
});
并在Configure方法中添加以下代码:
app.UseAuthentication();
步骤 2:登录时发送 jwt 令牌。
public class LoginRepository
{
public LoginRepository()
{
//TODO: Dependency to MongoDB will be initialized here
}
public LoginStatus Authenticate(string username, string password)
{
LoginStatus loginStatus = new LoginStatus();
string secretKey = ConfigurationManager.AppSetting["Jwt:SecretKey"];
int tokenExpirationHours = int.Parse(ConfigurationManager.AppSetting["Jwt:TokenExpirationHours"]);
//TODO: Need to add the userID in the payload. UserID will come from Database
Dictionary<string, string> payload = new Dictionary<string, string>() {
{ "UserName", username}
};
//TODO: Need to check the username and password in Database and then generate the token
loginStatus.Token = JwtTokenHelper.GenerateJwtToken(secretKey, payload, tokenExpirationHours);
return loginStatus;
}
}
这是 JwtTokenHelper:
public class JwtTokenHelper
{
public static string GenerateJwtToken(string secretKey, IReadOnlyDictionary<string, string> payloadContents, int tokenExpirationHours)
{
JwtSecurityTokenHandler jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);
var payloadClaims = payloadContents.Select(c => new Claim(c.Key, c.Value));
var payload = new JwtPayload("", "", payloadClaims, DateTime.Now, DateTime.Now.AddHours(tokenExpirationHours));
var header = new JwtHeader(signingCredentials);
var securityToken = new JwtSecurityToken(header, payload);
return jwtSecurityTokenHandler.WriteToken(securityToken);
}
}
在这里,我成功获得了 JWT 令牌。
第 3 步:现在,我尝试授权控制器,当我在 Postman 的 Authorization 标头中提供令牌时,它运行良好。
namespace SampleAPI.Controllers
{
[Authorize]
[Produces("application/json")]
[Route("api/Test")]
public class TestController : Controller
{
[HttpGet]
[Route("Testing")]
public IActionResult Testing()
{
return Ok("Yes");
}
}
}
但是,如果我更改 JWT 令牌中的某些内容并再次点击此端点,它会返回“是”,表示 jwt 令牌是有效的。但是在发送授权标头之前,我已经更改了该令牌的某些部分。
我在这里想念什么?您能否指出我应该遵循的更多步骤?
解决方案
推荐阅读
- javascript - 动态删除复杂 JSON 数据中的空键(使用 vanilla JavaScript)
- shiny - dplyr::summarise 渲染表错误
- python - python修复TypeError:必须是str,而不是int
- javascript - 理解百度ECharts中的`treemap.data.label.formatter`
- postgresql - postgresql 错误分组和聚合错误
- php - Laravel sql if 语句
- pdf - 带有 Windows 或 Linux 内部链接预览的 pdf 查看器
- task - 如何在pcf的spring批处理应用程序中调用作业?
- java - 在 Spring Boot 测试中排除配置
- javascript - 循环遍历字符串并动态插入属性 vanilla js