使用 Identity Server 和 SaasKit 发布 securig MultiTenant 应用程序

Posted

技术标签:

【中文标题】使用 Identity Server 和 SaasKit 发布 securig MultiTenant 应用程序【英文标题】:Issue securig MultiTenant Application with Identity Server & SaasKit 【发布时间】:2019-01-14 08:01:06 【问题描述】:

我创建了一个多租户 ASP.NET Core Web API 并由 Identity Server 保护。我使用 SaasKit Multitenancy nugget 进行多租户。多租户工作正常。我遇到了身份验证问题。

我为不同的租户使用了不同的主机名。我为每个租户定义了不同的范围,并根据租户的范围检索令牌。对 API 的第一个请求工作正常。但是当第二个租户尝试访问 API 时,它会因受众验证而出错。令牌具有有效受众,但 Web API 仍使用第一个请求的受众。

这是我的 API 中的代码:

services.AddSingleton<IOptionsMonitor<IdentityServerAuthenticationOptions>, IdentityServerTenantProvider>();

        services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
   .AddIdentityServerAuthentication(options =>
   
        options.RequireHttpsMetadata = false;
   );

这里是 IdentityServerTenantProvider 的实现

protected override IdentityServerAuthenticationOptions Create(IdentityServerAuthenticationOptions options, string name, string tenant, string tenantHostName)
    
        var currentTenantContext = this._memoryCache.Get(tenantHostName) as TenantContext<PaperSaveAPITenant>;

        options.Authority = currentTenantContext.Tenant.Authority;
        options.ApiName = currentTenantContext.Tenant.ApiName;
        return base.Create(options, name, tenant, tenantHostName);
    

对于租户 2,它正在设置正确的 API 名称和权限,但在验证令牌 API 时仍然使用第一个租户的 API 名称。

【问题讨论】:

您的问题解决了吗?我也在研究 IdentityServer + 多租户应用程序。如果您能够解决此问题,请分享更多信息。 【参考方案1】:

我可以使用以下代码解决它。

services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme,
        jwtOptions =>
        
        ,
        referenceOptions => 
        );

然后为 JwtBearerOptions(用于 JWT 令牌)和 OAuth2IntrospectionOptions(用于参考令牌)注册 IOptionMonitor。我同时使用了这两种令牌,因为我的 API 支持这两种类型的令牌。 (参考和智威汤逊)。如果您只使用其中之一,则无需同时指定两者。

services.AddSingleton<IOptionsMonitor<JwtBearerOptions>, JWTOptionsProvider>();
services.AddSingleton<IOptionsMonitor<OAuth2IntrospectionOptions>, OAuth2IntrospectionOptionsProvider>();

并且您需要创建从 TenantOptionsProvider 继承的“JWTOptionsProvider”类和从 TenantOptionsProvider 继承的“OAuth2IntrospectionOptionsProvider”类

【讨论】:

以上是关于使用 Identity Server 和 SaasKit 发布 securig MultiTenant 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用Identity Server 4建立Authorization Server

WIF(使用 Thinktecture Identity Server)和双工 WCF 通道

使用 Identity Server 和 SaasKit 发布 securig MultiTenant 应用程序

FireDAC,阵列DML,SQL Server和IDENTITY_INSERT

.Net Core 自定义身份验证使用 API 密钥和 Identity Server 4

移动和 Web 应用程序的 Identity Server3 身份验证