在 AuthenticationBuilder 中处理加密的 SAML 时“未找到给定令牌的令牌验证器”

问题描述 投票:0回答:1

我维护一个使用联合 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”,但经过一些实验后,应用程序永远不会达到这一点。

c# .net encryption saml ws-federation
1个回答
0
投票

我们遇到了这个问题并添加:

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

© www.soinside.com 2019 - 2024. All rights reserved.