我在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始终返回“未经授权”。