JwtToken AudienceValidator在IEnumerable <string>观众中缺少观众

时间:2017-08-23 14:54:08

标签: c# asp.net-core asp.net-core-mvc

我有一个asp net core api,我需要为&#34;观众提供自定义验证&#34;在JWT令牌中声明。
这可以通过AudienceValidator代表(Microsoft.IdentityModel.Tokens)签名:

bool CustumValidator(IEnumerable<string> audiences, SecurityToken securityToken, TokenValidationParameters validationParameters) 

根据我的理解,audiences应包含令牌中的受众列表。 validationParameters包含您在启动时注册的所有TokenValidationParameters然而,对我来说这个参数是空的。

在我的启动类的configure方法中,如果有以下内容:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime applicationLifetime)
    {
        //...

        // Setup JWT for the application.
        var jwtAppSettingOptions = ConfigurationRoot.GetSection(nameof(JwtIssuerOptions));
        var tokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)],
            ValidateAudience = true,
            //ValidAudience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)], -- I have tried with both this property and the ValidAudiences one below
            ValidAudiences = new[] { jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)] },
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = _jwtSigningKey,
            RequireExpirationTime = true,
            ValidateLifetime = true,
            ClockSkew = TimeSpan.Zero,
            AudienceValidator = DoValidation // <-- my custom validation method, described below
        };

        //....
    }

然后我有了这个小测试方法,现在除了返回true之外什么也没做。

    private bool DoValidation(IEnumerable<string> audiences, SecurityToken securityToken, TokenValidationParameters validationParameters)
    {
        var castedToken = securityToken as JwtSecurityToken;
        // Do Nothing
        return true;
    }

如上所述,上述部分中的此标记在其受众属性中没有任何价值,IEnumerable<string> audiences也是空的。我不懂为什么。如果我使用默认验证器方法(通过不设置委托),则能够看到令牌的受众,并且如果受众不正确则禁止访问。那么为什么我的自定义方法无法传入受众?

以下是我如何制作令牌:

        var jwt = new JwtSecurityToken(
            _jwtIssuerOptions.Issuer,
            String.IsNullOrWhiteSpace(_aud) ? _jwtIssuerOptions.Audience : _aud,
            claims,
            _jwtIssuerOptions.NotBefore,
            _jwtIssuerOptions.Expiration,
            _jwtIssuerOptions.SigningCredentials);

提前致谢。

1 个答案:

答案 0 :(得分:0)

我在尝试查找AudienceValidator委托的签名时遇到了这个问题。 (谢谢你!)

当我处理该委托时,我可以填充可枚举的受众群体。我看到的一个区别是我没有指定ValidAudiences参数。您可以尝试排除(假设您尚未解决此问题)。以下是我的工作代码示例:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = "MyIssuer",
                    IssuerSigningKey = new SymmetricSecurityKey(
                        Encoding.UTF8.GetBytes(Configuration["SecurityKey"])),
                    AudienceValidator = validateAudience
                };
            });