首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Identity Server和SaasKit发布安全的MultiTenant应用

使用Identity Server和SaasKit发布安全的MultiTenant应用
EN

Stack Overflow用户
提问于 2018-08-07 17:21:14
回答 1查看 575关注 0票数 2

我已经创建了一个多租户ASP.NET Core Web,并受到Identity Server的保护。我已经使用SaasKit多租户金块来实现多租户。而且多租户工作得很好。我面临着身份验证的问题。

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

以下是我的API中的代码:

代码语言:javascript
复制
services.AddSingleton<IOptionsMonitor<IdentityServerAuthenticationOptions>, IdentityServerTenantProvider>();

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

下面是IdentityServerTenantProvider的实现

代码语言:javascript
复制
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名称。

EN

回答 1

Stack Overflow用户

发布于 2018-09-20 12:21:13

我可以使用下面的代码来解决这个问题。

代码语言:javascript
复制
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme,
        jwtOptions =>
        {
        },
        referenceOptions => {
        });

然后为JwtBearerOptions (用于JWT令牌)和OAuth2IntrospectionOptions (用于引用令牌)注册IOptionMonitor。我使用两者都是因为我的API支持这两种类型的令牌。(参考文献& JWT)。如果您只使用其中的一个,那么您不需要同时指定两个。

代码语言:javascript
复制
services.AddSingleton<IOptionsMonitor<JwtBearerOptions>, JWTOptionsProvider>();
services.AddSingleton<IOptionsMonitor<OAuth2IntrospectionOptions>, OAuth2IntrospectionOptionsProvider>();

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51723227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档