首页 > 解决方案 > 自定义 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 不断返回“未经授权”。

标签: c#authentication.net-corejwt

解决方案


我在 .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;
    }
}

推荐阅读