如何在asp.net core 2.0中允许多个具有不同发行者的JWT

Mat*_*ias 8 jwt asp.net-core-2.0

有没有办法在单个 asp.net core 2.0 应用程序中处理来自多个颁发者的 JWT?

这是我目前检查令牌的方式:

public void ConfigureServices(IServiceCollection services)
{
    TokenValidationParameters tokenValidationParameters = new TokenValidationParameters
    {
        // ...

        ValidateIssuer = true,
        ValidIssuer = options.Issuer, // <-- could this be a list of issuers?

        // ...
    };

    services.AddAuthentication()
        .AddJwtBearer(jwtOptions =>
        {
            jwtOptions.TokenValidationParameters = tokenValidationParameters;
        });

    services.AddAuthorization(authOptions =>
        {
            authOptions.DefaultPolicy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme).RequireAuthenticatedUser().Build();
        });
}

public void Configure(IApplicationBuilder app)
{   
    // ...
    app.UseAuthentication();
}
Run Code Online (Sandbox Code Playgroud)

我之所以要处理多个颁发者,是因为我需要处理具有不同权限的不同用户类型。为了在微服务架构环境中只允许特定用户使用某些服务,我想为每个用户类型使用不同的发行者发行令牌。

小智 9

简单的答案是设置 TokenValidationParameters 实例的 ValidIssuers 属性而不是 ValidIssuer 属性。ValidIssuers 属性采用 IEnumerable,因此您可以填充颁发者名称列表并将其分配给该属性(或仅内联该列表)。

var issuers = new List<string>()
    {
        "issuerA",
        "issuerB"
    };
// ...
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters
{
    // ...

    ValidateIssuer = true,
    ValidIssuers = issuers

    // ...
};
Run Code Online (Sandbox Code Playgroud)

警告:这假设每个发行者共享相同的秘密(或秘密列表,如果您使用相应的 IssuerSigningKeys 属性而不是 IssuerSigningKey 属性)。

  • 如果您有多个颁发者/秘密对,那么您可以多次调用 AddJwtBearer。请参阅 /sf/ask/3478606841/。 (2认同)