我创建了一个多租户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名称。
答案 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”