我已经创建了一个多租户ASP.NET Core Web,并受到Identity Server的保护。我已经使用SaasKit多租户金块来实现多租户。而且多租户工作得很好。我面临着身份验证的问题。
我对不同的租户使用了不同的主机名。我为每个租户定义了不同的作用域,并根据租户的作用域检索令牌。对API的第一个请求可以正常工作。但是,当第二个租户尝试访问API时,它会因为受众验证而出错。Token具有有效的访问群体,但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名称。
发布于 2018-09-20 12:21:13
我可以使用下面的代码来解决这个问题。
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme,
jwtOptions =>
{
},
referenceOptions => {
});然后为JwtBearerOptions (用于JWT令牌)和OAuth2IntrospectionOptions (用于引用令牌)注册IOptionMonitor。我使用两者都是因为我的API支持这两种类型的令牌。(参考文献& JWT)。如果您只使用其中的一个,那么您不需要同时指定两个。
services.AddSingleton<IOptionsMonitor<JwtBearerOptions>, JWTOptionsProvider>();
services.AddSingleton<IOptionsMonitor<OAuth2IntrospectionOptions>, OAuth2IntrospectionOptionsProvider>();并且您需要创建继承自TenantOptionsProvider的"JWTOptionsProvider“类和继承自TenantOptionsProvider的"OAuth2IntrospectionOptionsProvider”类
https://stackoverflow.com/questions/51723227
复制相似问题