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

时间:2018-08-07 09:21:14

标签: token access-token identityserver4 multi-tenant

我创建了一个多租户ASP.NET Core Web API,并由Identity Server保护。我已将SaasKit多租户块用于多租户。而且多租户运作良好。我面临身份验证问题。

我为不同的租户使用了不同的主机名。我为每个租户定义了不同的范围,并根据租户的范围检索令牌。对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名称。

1 个答案:

答案 0 :(得分:0)

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

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

,然后为IwtMonitor注册JwtBearerOptions(用于JWT令牌)和OAuth2IntrospectionOptions(用于参考令牌)。我使用这两种方法是因为我的API支持两种类型的令牌。 (参考和JWT)。如果仅使用之一,则无需同时指定两者。

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

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