我维护一个使用联合 IDP 和 SAML 的 .NET 6 Web 应用程序。 我们的 IDP 现在强制对 SAML(不仅仅是 SSL)进行加密,这引起了一些麻烦。 以下是当前实现的相关部分:
Builder.Services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddWsFederation(options =>
{
options.AllowUnsolicitedLogins = true;
options.Wtrealm = Builder.Configuration["wsfed:realm"];
options.SignOutWreply = Builder.Configuration["wsfed:signout"];
options.MetadataAddress = Builder.Configuration["wsfed:metadata"];
options.RemoteSignOutPath = Builder.Configuration["wsfed:signoutpath"];
options.CorrelationCookie.SecurePolicy = CookieSecurePolicy.Always;
options.TokenValidationParameters = new TokenValidationParameters { SaveSigninToken = true };
options.Events.OnSecurityTokenReceived = n => SecurityTokenReceived(n);
})
我正在利用 Microsoft.AspNetCore.Authentication.WsFederation 命名空间中的 AddWsFederation,该命名空间一直与未加密的 SAML 顺利配合。 应用程序收到加密令牌后,“SecurityTokenException:找不到给定令牌的令牌验证器。”被抛出。 经过几天的研究,管道似乎无法计算出令牌类型是什么,因为它是加密的。
任何帮助将不胜感激!
我可以在 SecurityTokenReceived 回调中看到有效负载被发布到应用程序。 TokenValidationParameters 对象上有一些属性,例如“TokenDecryptionKey”,但经过一些实验后,应用程序永远不会达到这一点。
我们遇到了这个问题并添加:
options.TokenHandlers.Add(new CustomSamlSecurityTokenHandler());
AddWsFederation 方法和此类:
public class CustomSamlSecurityTokenHandler : SamlSecurityTokenHandler
{
public override async Task<TokenValidationResult> ValidateTokenAsync(string token, TokenValidationParameters validationParameters)
{
var configuration = await validationParameters.ConfigurationManager.GetBaseConfigurationAsync(CancellationToken.None).ConfigureAwait(false);
var issuers = new[] { configuration.Issuer };
validationParameters.ValidIssuers = (validationParameters.ValidIssuers == null ? issuers : validationParameters.ValidIssuers.Concat(issuers));
validationParameters.IssuerSigningKeys = (validationParameters.IssuerSigningKeys == null ? configuration.SigningKeys : validationParameters.IssuerSigningKeys.Concat(configuration.SigningKeys));
return await base.ValidateTokenAsync(token, validationParameters).ConfigureAwait(false);
}
}
解决了。尝试一下,我们从这里得到它:https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/2406