IdentityServer4重复范围

时间:2018-05-09 20:51:45

标签: asp.net-core identityserver4

我有一个REST网络服务,我们可以部署n个客户端。部署相同的应用程序,只是配置不同。我们有一个Web前端网站,可以与这些REST Web服务实例进行通信。用户使用IdentityServer4对实例进行身份验证,使用前端调用后端Web服务实例,并将令牌传递给它。

我需要阻止检索的令牌授予对webservice-X的访问权限以用于访问webservice-Y。理想情况下,我为每个具有相同范围的已部署客户端定义了ApiResource。我在尝试进行身份验证时收到以下错误消息:

  

找到重复的API范围。这是一个无效的配置。为API范围使用不同的名称。找到的范围:PaymentApi,DocumentApi

有没有办法可以禁用此重复检查?有没有其他方法来配置一切来完成这个?

我的部分配置:

            new ApiResource
            {
                Name = "WebService-X",
                DisplayName = "WebService-X",
                Description = "Client Api residing on customer-X network",
                Enabled = true,
                Scopes = new List<Scope>()
                {
                    new Scope()
                    {
                        Name = "PaymentApi",
                        DisplayName = "PaymentApi",
                        ShowInDiscoveryDocument = true,
                    },
                    new Scope()
                    {
                        Name = "DocumentApi",
                        DisplayName = "DocumentApi",
                        ShowInDiscoveryDocument = true,
                    }
                },
                ApiSecrets = new List<Secret>
                {
                    new Secret("fdzxGSDFHY)GSFD*U)DIS:LGJSLKFDJGG".Sha256())
                },
            },
            new ApiResource
            {
                Name = "WebService-Y",
                DisplayName = "WebService-Y",
                Description = "Client Api residing on customer-Y network",
                Enabled = true,
                Scopes = new List<Scope>()
                {
                    new Scope()
                    {
                        Name = "PaymentApi",
                        DisplayName = "PaymentApi",
                        ShowInDiscoveryDocument = true,
                    },
                    new Scope()
                    {
                        Name = "DocumentApi",
                        DisplayName = "DocumentApi",
                        ShowInDiscoveryDocument = true,
                    }
                },
                ApiSecrets = new List<Secret>
                {
                    new Secret("fdzxGSDFHY)GSDFS$#%#$LKFDJGG".Sha256())
                },
            },

我想避免这样的事情,因为它不能很好地扩展:

                new ApiResource
                {
                    Name = "WebService-X",
                    DisplayName = "WebService-X",
                    Description = "Client Api residing on customer-X network",
                    Enabled = true,
                    Scopes = new List<Scope>()
                    {
                        new Scope()
                        {
                            Name = "PaymentApi-X",
                            DisplayName = "PaymentApi-X",
                            ShowInDiscoveryDocument = true,
                        },
                        new Scope()
                        {
                            Name = "DocumentApi-X",
                            DisplayName = "DocumentApi-X",
                            ShowInDiscoveryDocument = true,
                        }
                    },
                    ApiSecrets = new List<Secret>
                    {
                        new Secret("fdzxGSDFHY)GSFD*U)DIS:LGJSLKFDJGG".Sha256())
                    },
                },
                new ApiResource
                {
                    Name = "WebService-Y",
                    DisplayName = "WebService-Y",
                    Description = "Client Api residing on customer-Y network",
                    Enabled = true,
                    Scopes = new List<Scope>()
                    {
                        new Scope()
                        {
                            Name = "PaymentApi-Y",
                            DisplayName = "PaymentApi-Y",
                            ShowInDiscoveryDocument = true,
                        },
                        new Scope()
                        {
                            Name = "DocumentApi-Y",
                            DisplayName = "DocumentApi-Y",
                            ShowInDiscoveryDocument = true,
                        }
                    },
                    ApiSecrets = new List<Secret>
                    {
                        new Secret("fdzxGSDFHY)GSDFS$#%#$LKFDJGG".Sha256())
                    },
                },

1 个答案:

答案 0 :(得分:0)

此验证是通过IResourceStoreExtensions内的扩展方法完成的。没有办法覆盖此行为,因为intended design至少是每个API资源的唯一API范围。

在您的特定情况下,您必须为每个租户配置范围和API资源,因为它们是不同的资源。

推测性地,如果您有一个集中资源,一个利用您的客户端点作为一种服务基础架构的资源,您可以将您的目标租户指示为请求的一部分,并使用范围声明来确定该请求是否是允许的。< / p>