You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取ADFS SAML响应数据?加密断言无法解析求助

问题分析与解决方案

兄弟,你这问题我太熟了——你拿到的SAML响应里的核心断言(Assertion)是加密状态的,这就是为啥你掏不出任何有效信息的原因!先看看你贴的响应内容(我帮你格式化了,看起来更清楚):

<samlp:Response Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified" 
                Destination="https://demo.apps.com/adfsauthlogin/login" 
                ID="_cbb5174b-36b4-4e75-9d8a-7f2d47ccb9bc" 
                IssueInstant="2018-01-08T06:09:16.122Z" 
                Version="2.0" 
                xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
    <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">http://adfs.Sample.com/adfs/services/trust</Issuer>
    <samlp:Status>
        <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
    </samlp:Status>
    <EncryptedAssertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
        <xenc:EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
            <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
            <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                <e:EncryptedKey xmlns:e="http://www.w3.org/2001/04/xmlenc#">
                    <e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p">
                        <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                    </e:EncryptionMethod>
                    <KeyInfo>
                        <ds:X509Data xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                            <ds:X509IssuerSerial>
                                <ds:X509IssuerName>CN=ADFS Encryption - demo.apps.com</ds:X509IssuerName>
                                <ds:X509SerialNumber>33157209971584938906555805034885884694</ds:X509SerialNumber>
                            </ds:X509IssuerSerial>
                        </ds:X509Data>
                    </KeyInfo>
                    <e:CipherData>
                        <e:CipherValue> ==- Value -== </e:CipherValue>
                    </e:CipherData>
                </e:EncryptedKey>
            </KeyInfo>
            <xenc:CipherData>
                <xenc:CipherValue> ==- Value -== </xenc:CipherValue>
            </xenc:CipherData>
        </xenc:EncryptedData>
    </EncryptedAssertion>
</samlp:Response>

为什么拿不到信息?

从响应里能明确看到,ADFS用了两层加密来保护敏感的断言内容:

  1. 用aes256-cbc算法加密了实际的SAML断言数据
  2. 用rsa-oaep-mgf1p算法加密了AES的对称密钥,并且绑定了ADFS的加密证书(CN=ADFS Encryption - demo.apps.com)

只有持有这个加密证书对应的私钥,才能解密拿到原始的明文断言。

怎么获取加密断言里的信息?

按以下步骤操作就行:

  • 第一步:解密对称密钥
    拿出你这边存储的ADFS Encryption - demo.apps.com证书的私钥,解密<e:EncryptedKey>里的<e:CipherValue>内容,得到AES256的对称密钥。
  • 第二步:解密断言内容
    用第一步得到的AES密钥,解密<xenc:EncryptedData>里的<xenc:CipherValue>,就能得到明文的<Assertion> XML。
  • 第三步:解析明文断言
    解析这个XML,就能拿到用户身份信息、属性声明、会话有效期等所有SAML断言里的内容了。

你的操作是否正确?

完全正确!从响应里的<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>可以看出,ADFS已经成功完成了身份验证,并且返回了合法的响应——只是出于安全考虑,ADFS默认会加密包含敏感用户数据的断言,所以你只需要补全解密环节就可以了。

实操小建议

如果不想自己写解密代码,可以用现成的工具省事儿:

  • 浏览器插件:SAML Tracer(可以捕获并自动解密SAML响应,前提是你能提供对应的私钥)
  • 本地工具:OpenSSL命令行工具(可以处理RSA和AES的解密操作)
  • 开发库:如果你是开发者,用OpenSAML(Java)、Kentor AuthServices(.NET)这类成熟的SAML库,它们都内置了加密断言的解密逻辑,只需要配置好证书私钥即可。

内容的提问来源于stack exchange,提问作者Dinesh92d

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:48:05