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

Posted

技术标签:

【中文标题】如何在 asp.net core 2.0 中允许具有不同发行者的多个 JWT【英文标题】:How to allow multiple JWT with different issuers in asp.net core 2.0 【发布时间】:2018-03-13 04:50:48 【问题描述】:

有没有办法在单个 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();

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

【问题讨论】:

请参阅***.com/questions/49694383/… 了解我们在应用程序中使用的解决方案 - 多次调用 AddJwtBearer。 【参考方案1】:

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

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

    // ...

    ValidateIssuer = true,
    ValidIssuers = issuers

    // ...
;

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

【讨论】:

非常感谢!有时答案是如此明显,以至于你看不到它。 如何处理多个发行者/秘密对? @JasonX:我认为,您可以使用 IssuerSigningKeyResolver 属性来指定您自己的解析器,这可以将令牌的发行者考虑在内。 如果您有多个颁发者/秘密对,那么您可以多次调用 AddJwtBearer。见***.com/questions/49694383/…。

以上是关于如何在 asp.net core 2.0 中允许具有不同发行者的多个 JWT的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 2.0 中设置多个身份验证方案?

如何在 ASP.NET Core 2.0 中预编译视图?

如何在 ASP.NET Core 2.0 Razor 页面中填充下拉列表

如何在 Asp.Net Core 2.0“AddJwtBearer”中间件中设置多个受众?

如何在 asp.net core v 2.0 中从 javascript 调用 PageModel 方法

ASP.Net Core 2.0 如何获取中间件中的所有请求标头? [复制]