使用多个IDServer保护单个api资源

时间:2019-03-23 02:43:47

标签: identityserver4

因此,我有一个.Net Core网络api,可以将其称为“ CMS”,其当前由IdentityServer4服务器作为api资源进行保护。我已将ID4服务器配置为具有MyIDP的IDP声明。

出于商业原因,我需要为客户端提供自己的IdentityServer,但他们也希望让其用户访问相同的api“ CMS”。

这可能吗? 在我的CMS API的StartUp.cs中,当前看起来像这样

services.AddAuthentication("Bearer")
    .AddIdentityServerAuthentication(options =>
                {
                    options.Authority = "http://www.idserver1.com";   
                    options.RequireHttpsMetadata = true; 
                    options.ApiName = "cmsapi"; 
                });

因此,要为另一台id服务器添加保护,我想我可以复制AddAuthentication,但将方案名称从Bearer更改为其他名称,但这似乎是错误的?

之所以应该这样做,是因为我已经能够以这种方式向我的Web应用程序添加多个外部提供程序。但这是用于s登录流程,而不是用于api。

如果可能的话,我该怎么办?

2 个答案:

答案 0 :(得分:0)

这可以很简单地实现。假设您要为每个客户端分别发布一个单独的子域:auth0.yourdomain.comauth1.yourdomain.com,并且您想要一个api资源尊重来自那些身份提供者中的任何一个的令牌。

假设签名密钥相同,则可以在Startup.cs->ConfigureServices(...)的身份服务器端配置共享发行者uri:

        var builder = services.AddIdentityServer(options => {
                              options.IssuerUri = "auth.yourdomain.com";
                              })
                 ...

然后在api端,您可以尊重单个颁发者uri,而不必重复验证方案:

services.AddAuthentication("Bearer")
    .AddIdentityServerAuthentication(options =>
                {
                    options.Authority = "auth.yourdomain.com";   
                    options.RequireHttpsMetadata = true; 
                    options.ApiName = "cmsapi"; 
                });    

我不记得的一件事是,是否为发行者uri推断了请求方案(http / https),因此您可能还需要指定它(https:\\auth.yourdomain.com)。除此之外,就您的客户而言,这种实现应该是无缝的。

答案 1 :(得分:0)

我想我可能已经找到解决方案了,这是基于在这里发生的另一个问题

Using Client Credentials flow on identityserver4 and custom AuthorizationHandler User.Identity.isAuthenticated = false

事实证明,您可以使用多个身份验证方案来保护api,并使用Authorize Attribute的authenticationSchemes属性选择要保护哪些内容。

所以您只需要一种将传入的承载令牌映射到正确的身份验证方案的方法