c# - 自定义 SecurityTokenValidator 有效但仍未经授权
问题描述
我在使用 JWT 验证的 dotnet 核心中遇到了一些麻烦。
我创建了一个自定义验证器,而不是验证令牌,它将被转发到另一个 API 并返回令牌。这非常有效,但是,我不断收到回复:未经授权。
这是我的验证器,很简单,它验证令牌,如果得到响应,应该没问题。
public class JwtValidator : ISecurityTokenValidator
{
AuthenticationClient authClient;
public JwtValidator(AuthenticationClient authClient)
{
this.authClient = authClient;
}
public bool CanValidateToken => true;
public int MaximumTokenSizeInBytes { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public bool CanReadToken(string securityToken)
{
return true;
}
public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
{
validatedToken = null;
//your logic here
var response = authClient.Validate(securityToken);
//assuming response will contain info about the user
if (response == null)
throw new SecurityTokenException("invalid");
validatedToken = response.Result;
return new ClaimsPrincipal(new ClaimsIdentity(response.Result.Claims));
}
没有抛出异常,令牌有效,正在返回声明。
在 Startup.cs 我有以下代码:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.SecurityTokenValidators.Clear();
options.SecurityTokenValidators.Add(new JwtValidator(authClient));
});
当我将日志记录添加到 JwtValidator 时,我确实得到了日志,因此该函数似乎被正确调用。但 API 不断返回“未经授权”。
解决方案
我在 .net core 5 中实现自定义 JWT 处理程序的方式是继承自 JwtSecurityTokenHandler 而不是 ISecurityTokenValidator(这是 SecurityTokenValidator 的基本接口)。然后为了验证我调用的令牌
var claimsPrincipal = base.ValidateToken(token, validationParameters, out validatedToken);
它直接返回 ClaimsPrinciple。在您的代码中,我怀疑 AuthenticationClient 可能是问题所在。下面是我的验证码。
public class JwtValidator : JwtSecurityTokenHandler
{
// Define constructor and other custom attributes
public ClaimsPrincipal ValidateToken(string securityToken,
TokenValidationParameters validationParameters,
out SecurityToken validatedToken)
{
var claimsPrincipal = base.ValidateToken(token, validationParameters, out validatedToken);
return claimsPrincipal;
}
}
推荐阅读
- regex - 正则表达式只允许某些字符
- sql - 从字符串中删除特殊字符 +
- ruby-on-rails - 审核 gem 以在管理面板中列出跟踪的更改
- python - Python 性能时间减去
- python - 在 Python 中使用字典时,如何返回具有相同值的键?
- c - gcc 错误 - 可能是库
- facebook - 带有移动应用程序和后端 Web 服务器的 Facebook OAuth
- javascript - 如何在 Liferay 中将“destoryOnHide”或“destroyOnClose”设置为现有的模态对话框?
- sql - 如何加入两个表的行数不同?
- wso2 - 高可用性设置中的 wso2am 2.2.0 发布者