C# 添加多个租户

C# 添加多个租户,c#,identityserver4,sustainsys-saml2,C#,Identityserver4,Sustainsys Saml2,将多个客户端添加到配置中的首选方式是什么。我们有一些客户希望继续使用ADF,因此他们有不同的端点/元数据 目前,我尝试在启动时从数据库读取配置,然后为每个数据库注册一个新的Saml12 auth private static void AddSaml2Client(AuthenticationBuilder builder, DomainProvider provider, string Saml2LocalEndpoint) {

将多个客户端添加到配置中的首选方式是什么。我们有一些客户希望继续使用ADF,因此他们有不同的端点/元数据

目前,我尝试在启动时从数据库读取配置,然后为每个数据库注册一个新的Saml12 auth

private static void AddSaml2Client(AuthenticationBuilder builder, DomainProvider provider, string Saml2LocalEndpoint)
        {            
            var settings = JsonHelpers.ParseJsonStringToObject<Saml2Setting>(provider.Settings);

            if (settings == null 
                || string.IsNullOrEmpty(settings.MetadataLocation) 
                || string.IsNullOrEmpty(settings.ProviderEndPoint))
            {
                Log.Error($"Missing or invalid settings for SAML2 client on {provider.DomainName}");
                return;
            }    

            builder.AddSaml2(provider.Name.Trim(), provider.Name.Trim(), options =>
            {
                options.SPOptions.EntityId = new EntityId(Saml2LocalEndpoint);


                options.IdentityProviders.Add(new IdentityProvider(
                    new EntityId(settings.ProviderEndPoint), options.SPOptions)
                {
                    MetadataLocation = settings.MetadataLocation,
                    LoadMetadata = settings.LoadMetadata,
                });
            });
        }
private static void AddSaml2Client(AuthenticationBuilder、DomainProvider提供程序、字符串SAML2LocalLendPoint)
{            
var settings=JsonHelpers.ParseJsonStringToObject(provider.settings);
如果(设置==null
||string.IsNullOrEmpty(settings.MetadataLocation)
||string.IsNullOrEmpty(settings.ProviderEndPoint))
{
Log.Error($“缺少{provider.DomainName}上SAML2客户端的设置或设置无效”);
返回;
}    
builder.AddSaml2(provider.Name.Trim(),provider.Name.Trim(),options=>
{
options.SPOptions.EntityId=新的EntityId(Saml2LocalEndpoint);
options.IdentityProviders.Add(新IdentityProvider(
新EntityId(settings.ProviderEndPoint)、options.SPOptions)
{
MetadataLocation=settings.MetadataLocation,
LoadMetadata=settings.LoadMetadata,
});
});
}
当我将两个不同的客户端添加到配置中时,一个工作正常,但另一个返回时出现了
未处理的异常:没有实体id为的Idphttp://xxxxx 未找到
错误

当你设置SPOptions时,有几点我还是有点模糊。EntityId这应该是我的端点(我估计是)还是客户

另外,在创建AddSaml2时,该方案指的是什么,我在任何文档中都看不到

谢谢

  • 如果多次调用
    AddSaml2
    ,则会添加Saml2处理程序的多个实例。每个模块都需要有一个唯一的
    模块路径
    。您在
    没有实体id为的Idp时看到的错误…
    就是由此引起的。第一个处理程序抛出一个错误,因为现在有另一个处理程序知道Idp,所以它不会抛出错误。唯一的
    Modulepath
    值将解决此问题
  • SPOptions.EntityId
    是您的标识符,应设置为每个实例的
    ModulePath
    的完整URL。请注意,从逻辑上讲,您正在创建多个Saml2 SP—每个调用
    AddSaml2
    一个SP,因此每个SP都应该具有唯一的ID
  • 该方案是标准的asp.net核心结构。每个实例也应该是唯一的

  • 最后,还有另一个选项-使用一个调用
    AddSaml2
    并添加多个身份提供者。这将把所有不同的SAML2 IDP放在一个身份验证方案下。但是,由于您已使用
    IdentityServer4
    标记了该问题,因此我不建议使用它-IdSrv4希望每个用户显示的身份验证选项对应于一个方案。因此,请使用多个代码
    添加SAML2
    。我只是想提一下,以使文章完整。

    看来这就解决了问题,正如你所说,我遗漏了ModulePath部分。在等待客户将其端点更改为confirmyep时,我确实遇到了另一个问题,即响应似乎缺少一些数据,但我非常确定这是一个客户机配置问题。谢谢你的帮助