c# - 添加多个租户
问题描述
将多客户端添加到配置中的首选方式是什么?我们有一些客户希望继续使用 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 时,该方案指的是什么,我在任何文档中都看不到这一点?
谢谢
解决方案
- 如果您
AddSaml2
多次调用,您将添加 Saml2 处理程序的多个实例。他们每个人都需要有一个独特的ModulePath
. 您看到的错误No Idp with entity id...
是由于这个原因。第一个处理程序会引发错误,因为现在没有另一个处理程序知道该 Idp。唯一Modulepath
值将解决这个问题。 SPOptions.EntityId
是您的标识符,应设置ModulePath
为每个实例的完整 URL。请注意,从逻辑上讲,您正在创建多个 Saml2 SP - 每个调用一个,AddSaml2
因此它们每个都应该具有唯一的 Id。- 该方案是一个标准的 asp.net 核心结构。每个实例也应该是唯一的。
最后,还有另一种选择——使用一次调用AddSaml2
并添加多个身份提供者。这会将所有不同的 SAML2 Idp 纳入一个身份验证方案。但是,正如您已将问题标记为IdentityServer4
我不会推荐它 - IdSrv4 期望每个用户显示的身份验证选项对应于一个方案。所以留在多个代码中AddSaml2
。只是想提一下以使帖子完整。
推荐阅读
- android - 如何更改远程视图中视图的属性?
- r - R:直接从 web url 读取 geotiff 数据(httr::GET 原始内容)
- javascript - XMasonry, XBlock (react-xmasonry) 用作单独的组件:TypeError: this.props.parent is undefined
- vba - VBA,根据指定工作表中的标识符列合并工作表中的表
- getstream-io - GetStream - 订购的聚合馈送时间
- python - 烧瓶部署:没有模块名称烧瓶
- fullcalendar - Fullcalendar : 从今天开始显示两个月
- python-3.x - 我怎样才能获得类似于下面共享的示例的 srcs 中的值?
- mysql - MySQL XDevAPI 因“队列为空”而崩溃
- azure - LUIS 管理 - “包括所有预测的意图分数”将被关闭