Asp.Net Core多Sustainsys Saml2配置第二实例失效问题求助
Asp.Net Core多Sustainsys Saml2实例配置问题排查
问题详情
在Asp.Net Core中配置了多个Sustainsys Saml2实例,第一个实例“SCHM-MI”运行正常,但第二个实例“SCHM-GL”无法正常工作。
配置代码
.AddSaml2("SCHM-MI", options => { options.SPOptions.EntityId = new EntityId("SCHM-MI"); options.IdentityProviders.Add(new IdentityProvider( new EntityId(".............."), options.SPOptions) { MetadataLocation = "...................", LoadMetadata = true }); }) .AddSaml2("SCHM-GL",options => { options.SPOptions.EntityId = new EntityId("SCHM-GL"); options.IdentityProviders.Add(new IdentityProvider( new EntityId(".................."), options.SPOptions) { MetadataLocation = "............", LoadMetadata = true }); });
登录Challenge请求代码
return new ChallengeResult( "SCHM-GL", new AuthenticationProperties { RedirectUri = Url.Action(nameof(LoginCallback), new { returnUrl = "http://localhost:4200/callback" }), });
报错信息
KeyNotFoundException: No Idp with entity id "GL Entity ID" found.
Sustainsys.Saml2.Configuration.IdentityProviderDictionary.get_Item(EntityId entityId)
使用版本:最新版Sustainsys.Saml2.AspNetCore2
解决方案
核心原因
当设置LoadMetadata = true时,Sustainsys会从指定的MetadataLocation拉取元数据,并自动覆盖手动创建IdentityProvider时指定的EntityId,导致后续查找IdP时找不到预期的实体ID。
修复步骤
确认元数据中的真实实体ID
- 直接访问第二个实例的
MetadataLocation地址,查找<md:EntityDescriptor entityID="xxx">节点,记录其中的真实IdP实体ID。
- 直接访问第二个实例的
修改Saml2实例配置
更新第二个实例的配置,确保手动指定的EntityId与元数据中的一致,同时禁用元数据对实体ID的覆盖:.AddSaml2("SCHM-GL",options => { options.SPOptions.EntityId = new EntityId("SCHM-GL"); var idp = new IdentityProvider( // 替换为元数据中获取的真实GL Entity ID new EntityId("真实的GL IdP实体ID"), options.SPOptions) { MetadataLocation = "............", LoadMetadata = true, // 禁止元数据更新实体ID UpdateEntityId = false, // 多实例场景建议开启,避免响应匹配问题 AllowUnsolicitedAuthnResponse = true }; options.IdentityProviders.Add(idp); });明确Challenge时的IdP实体ID
如果需要确保Challenge请求指向正确的IdP,可以在AuthenticationProperties中显式指定:return new ChallengeResult( "SCHM-GL", new AuthenticationProperties { RedirectUri = Url.Action(nameof(LoginCallback), new { returnUrl = "http://localhost:4200/callback" }), Items = { { "Saml2:Idp", "真实的GL IdP实体ID" } } });排查元数据加载问题
- 启用Sustainsys的调试日志,查看元数据加载过程:
在appsettings.json中添加日志配置:
通过日志确认第二个实例的元数据是否成功拉取、解析,是否存在网络或格式错误。"Logging": { "LogLevel": { "Sustainsys": "Debug" } }
- 启用Sustainsys的调试日志,查看元数据加载过程:
内容的提问来源于stack exchange,提问作者Imrankhan Pathan
相关产品推荐
相关产品推荐

