我有一个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())
},
},
答案 0 :(得分:0)
此验证是通过IResourceStoreExtensions内的扩展方法完成的。没有办法覆盖此行为,因为intended design至少是每个API资源的唯一API范围。
在您的特定情况下,您必须为每个租户配置范围和API资源,因为它们是不同的资源。
推测性地,如果您有一个集中资源,一个利用您的客户端点作为一种服务基础架构的资源,您可以将您的目标租户指示为请求的一部分,并使用范围声明来确定该请求是否是允许的。< / p>