首页 > 解决方案 > 添加多个租户

问题描述

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

目前我试图在启动时从数据库中读取配置,然后为每个人注册一个新的 Saml12 身份验证。

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,
                });
            });
        }

当我在配置中添加了 2 个不同的客户端时,一个可以正常工作,但另一个返回一个unhanded exception has occurred: No Idp with entity id http://xxxxx not found错误

当您设置 SPOptions.EntityId 时,我仍然有点模糊,这应该是我的端点(我假设它是)还是客户。

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

谢谢

标签: c#identityserver4sustainsys-saml2

解决方案


  1. 如果您AddSaml2多次调用,您将添加 Saml2 处理程序的多个实例。他们每个人都需要有一个独特的ModulePath. 您看到的错误No Idp with entity id...是由于这个原因。第一个处理程序会引发错误,因为现在没有另一个处理程序知道该 Idp。唯一Modulepath值将解决这个问题。
  2. SPOptions.EntityId是您的标识符,应设置ModulePath为每个实例的完整 URL。请注意,从逻辑上讲,您正在创建多个 Saml2 SP - 每个调用一个,AddSaml2因此它们每个都应该具有唯一的 Id。
  3. 该方案是一个标准的 asp.net 核心结构。每个实例也应该是唯一的。

最后,还有另一种选择——使用一次调用AddSaml2并添加多个身份提供者。这会将所有不同的 SAML2 Idp 纳入一个身份验证方案。但是,正如您已将问题标记为IdentityServer4我不会推荐它 - IdSrv4 期望每个用户显示的身份验证选项对应于一个方案。所以留在多个代码中AddSaml2。只是想提一下以使帖子完整。


推荐阅读