我正在尝试设置IdentityServer4以处理多个外部IdP,这些IdP是在IAuthenticationSchemeProvider
的AddScheme
方法的帮助下动态添加的。
我已经成功地为OpenIdConnect
IdP做了这件事,但在基于Saml2p
的IdP上遇到了一些麻烦。在this样本之后,我遵循Saml2p的相同逻辑:
注入IOptionsMonitorCache<Saml2pAuthenticationOptions>
和:
if (await _schemeProvider.GetSchemeAsync(scheme) == null)
{
_schemeProvider.AddScheme(new AuthenticationScheme(scheme, scheme, typeof(Saml2pAuthenticationHandler)));
}
else
{
_saml2pOptionsCache.TryRemove(scheme);
}
_saml2pOptionsCache.TryAdd(scheme, samlOptions);
我得到一个例外:
Unable to resolve service for type 'Rsk.AspNetCore.Authentication.Saml2p.Factories.ISamlFactory``1[IdentityServer4.Saml.Generators.Interfaces.IServiceProviderMetadataGenerator]' while attempting to activate 'Rsk.AspNetCore.Authentication.Saml2p.Saml2pAuthenticationHandler'.
我不确定我是否应该在添加方案时设置一些关于Saml的其他配置,任何帮助表示赞赏。
编辑:我正在使用Rsk NuGet for SAML 2.0
对AddSaml2p
的调用注册了一系列依赖项以及身份验证处理程序。
我要么在代码中的某处调用AddSaml2p
,要么自己注册所需的依赖项:
builder.Services.AddMemoryCache();
builder.Services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.TryAddScoped<ISamlFactory<IServiceProviderMetadataGenerator>,
builder.Services.TryAddScoped<ISamlFactory<ISaml2SingleSignOnRequestGenerator>, Saml2SingleSignOnRequestGeneratorFactory>();
builder.Services.TryAddScoped<ISamlFactory<ISaml2SingleLogoutRequestGenerator>, Saml2SingleLogoutRequestGeneratorFactory>();
builder.Services.TryAddScoped<ISamlFactory<ISaml2SingleSignOnResponseValidator>, Saml2SingleSignOnResponseValidatorFactory>();
builder.Services.TryAddScoped<ISamlBindingService, SamlBindingService>();
builder.Services.TryAddScoped<ISamlSigningService, SamlSigningService>();
builder.Services.TryAddScoped<IDateTimeService, SystemClockDateTimeService>();
builder.Services.TryAddScoped<ISamlTimeComparer, SamlTimeComparer>();
builder.Services.TryAddScoped<ISamlCorrelationStore, CookieCorrelationStore>();