ITfoxtec SAML 2.0:配置 AWS SSO 时出现 InvalidSignatureException

Posted

技术标签:

【中文标题】ITfoxtec SAML 2.0:配置 AWS SSO 时出现 InvalidSignatureException【英文标题】:ITfoxtec SAML 2.0: InvalidSignatureException When Configuring AWS SSO 【发布时间】:2021-10-05 06:39:32 【问题描述】:

我有一个小型测试应用程序,已成功与 Okta 集成为 IdP。我还设置了 AWS SSO 作为 IdP。当我将我的应用程序切换为使用 AWS SSO 时,我收到以下错误:

ITfoxtec.Identity.Saml2.Cryptography.InvalidSignatureException: Signature is invalid.
   at ITfoxtec.Identity.Saml2.Saml2Request.ValidateXmlSignature(SignatureValidation documentValidationResult)
   at ITfoxtec.Identity.Saml2.Saml2Request.Read(String xml, Boolean validateXmlSignature)
   at ITfoxtec.Identity.Saml2.Saml2Response.Read(String xml, Boolean validateXmlSignature)
   at ITfoxtec.Identity.Saml2.Saml2AuthnResponse.Read(String xml, Boolean validateXmlSignature)
   at ITfoxtec.Identity.Saml2.Saml2PostBinding.Read(HttpRequest request, Saml2Request saml2RequestResponse, String messageName, Boolean validateXmlSignature)
   at ITfoxtec.Identity.Saml2.Saml2PostBinding.UnbindInternal(HttpRequest request, Saml2Request saml2RequestResponse, String messageName)
   at ITfoxtec.Identity.Saml2.Saml2Binding`1.Unbind(HttpRequest request, Saml2Response saml2Response)
   at SAML_Example.Controllers.AuthController.AssertionConsumerService() in C:\Workspace\saml\SAML_Example\AuthController.cs:line 46
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

我已验证从 AWS SSO 返回的签名算法与 Okta 返回的 http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 匹配。是否有人使用 AWS SSO 成功配置了 ITfoxtec?

【问题讨论】:

【参考方案1】:

是基于元数据集成到 Okta 和 AWS,还是通过配置 IdP 证书来配置对外部 IdP 的信任?

听起来您正在针对不正确的证书验证 AWS IdP。

【讨论】:

我在这两种情况下都使用了供应商元数据。我在 AWS SSO 端尝试了多个不同的证书,甚至尝试了一个 sha1 证书(使用上面列出的签名算法以及 sha1 的适当签名算法)但仍然是同样的错误。 我不这么认为。在调试器中观看时,我可以查看 SAML 对象。返回的对象中是否有我应该查看的特定数据项以验证它是否未加密? 返回 CheckSignature(Saml2Signer.Certificate.GetRSAPublicKey()) 似乎失败了;在 Saml2SignedXml.cs 中。这是调用 .Net 安全库,由于某种原因,这在使用 Okta 时会通过,但在使用 AWS SSO 时不会通过。我在两种设置上比较了从 Saml2Signer.Certificate.GetRSAPublicKey() 返回的对象,并且找不到对象之间的任何显着差异。任何关于在差异方面寻找什么的指针都将不胜感激。 我能够通过更新 UnbindInternal 方法以将 false 值发送到 validateXmlSignature 的 Read 方法来使其工作。除非我遗漏了什么,否则似乎没有一种编程或基于配置的方式来设置它。 我已经联系了 AWS,看看他们是否知道为什么他们的签名无法被这个库验证。如果他们无法提供任何解决方案,我要么需要继续禁用签名验证,要么继续使用另一个 SAML 库。【参考方案2】:

据我了解,通常断言标签是已签名的。在 AWS 的案例中,他们签署了断言标签以及整个响应。断言标签的签名不会对我进行验证,但整个响应的签名会。我认为既然断言在响应中,它也可以被认为是有效的。

我删除了对unbind 的调用并将其替换为以下内容:

var certValidation = true;
var cert = _samlConfig.SignatureValidationCertificates.FirstOrDefault();
var nodes = saml2AuthnResponse.XmlDocument.SelectNodes("//*[local-name()='Signature']").ToEnumerable().ToList();
var responseSignature = nodes.FirstOrDefault(n => n?.ParentNode?.LocalName == "Response");
if (responseSignature != null)

    var signedXml = new SignedXml(responseSignature.ParentNode as XmlElement);
    signedXml.LoadXml(responseSignature as XmlElement);
    certValidation = signedXml.CheckSignature(cert, true);

else

    foreach (var node in nodes)
    
        var signedXml = new SignedXml(node.ParentNode as XmlElement);
        signedXml.LoadXml(node as XmlElement);
        certValidation = certValidation && signedXml.CheckSignature(cert, true);
    

如果整个响应中没有签名,它会恢复到原始行为并检查存在的每个签名。

【讨论】:

以上是关于ITfoxtec SAML 2.0:配置 AWS SSO 时出现 InvalidSignatureException的主要内容,如果未能解决你的问题,请参考以下文章

ITfoxtec SAML 2.0 Azure 广告证书格式问题 .Cer 到 .PFX

itfoxtec-identity-saml2 中的方法 ValidateRelyingParty 从哪里派生?

ITfoxtec.Identity.Saml2.Saml2RequestException:“不完全是一个断言元素。”

使用 ITfoxtec.Identity.Saml2 登录用户

ITfoxtec.Identity.Saml2 无效 URI 问题

ITfoxtec - ADFS SAML2 根据验证程序,远程证书无效