ADFS 不会将来自声明提供者的 Ws-Fed 响应的声明传递给 RP 的传出 SAML 响应

ADFS don't pass claims from Ws-Fed response from Claim Provider to outgoing SAML response for RP

在我的环境中有一个 ADFS 4.0 和 asp.net 项目,其中 IdentityServer4 + WsFederation 包作为声明提供者。所有使用 Ws-Fed 协议的 RP 都可以正常工作。但是 SAMLP RP,没有收到响应中的声明。

排序: RP 在 ADFS 中发起 SAML 登录请求。 ADFS 向 IdentityServer4 发出 Ws-Fed 登录请求。 ADFS 使用适当的声明获取 Ws-Fed 响应。但是在下一步,当 ADFS 从 Ws-Fed 响应生成 SAML 响应时,ADFS 会在没有声明的情况下为 RP 发出 SAML 响应...... 事件日志中有错误:

事件 ID:303:

Additional Data 
    Exception details: 
    System.IdentityModel.Tokens.SecurityTokenException: MSIS7099: SubjectConfirmationData element was missing in received token.
       at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolManager.ValidateRequestProperties(Saml2SecurityToken token)
       at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolManager.Issue(HttpSamlRequestMessage httpSamlRequestMessage, SecurityTokenElement onBehalfOf, String sessionState, String relayState, String& newSamlSession, String& samlpAuthenticationProvider, Boolean isUrlTranslationNeeded, WrappedHttpListenerContext context, Boolean isKmsiRequested)

带有 UPN 和电子邮件声明的 Ws-Fed 消息:

    <t:RequestSecurityTokenResponse xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust"
                                Context="RPUrl=http://xxxxxx.com%2fadfs%2fservices%2ftrust\BaseUrl=http%3a%2f%2fxxxxxxxx.com%2fadfs%2fservices%2ftrust\ProtocolID=Saml\Id=id-8cbbc2e6-70f5-4804-9e61-99fd13781978\SAMLRequest=xxxxxxxx%3d\ProtocolBinding=urn%3aoasis%3anames%3atc%3aSAML%3a2.0%3abindings%3aHTTP-Redirect\RelayState=8e27a614-61b2-47f0-9583-f9be1d9ee75a"
                                >
    <wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
        <wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
            <wsa:Address>http://xxxxxxxx.xxxxxxxxx.com/adfs/services/trust</wsa:Address>
        </wsa:EndpointReference>
    </wsp:AppliesTo>
    <t:RequestedSecurityToken>
        <Assertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion"
                   ID="_aac09822-5db4-4791-b677-690ef5bf273e"
                   IssueInstant="2020-07-01T14:10:26.357Z"
                   Version="2.0"
                   >
            <Issuer>https://xxxxxxxxxx.xxxxxxxxxxx.com</Issuer>
            <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
                <SignedInfo>
                    <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                    <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
                    <Reference URI="#_aac09822-5db4-4791-b677-690ef5bf273e">
                        <Transforms>
                            <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                            <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </Transforms>
                        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
                        <DigestValue>/2MHUXKcVJHSzV70wbFJVFrnYawDdFYPuekSh1/zEC4=</DigestValue>
                    </Reference>
                </SignedInfo>
                <SignatureValue>xxxxxxxxxx</SignatureValue>
                <KeyInfo>
                    <X509Data>
                        <X509Certificate>xxxxxxxxx</X509Certificate>
                    </X509Data>
                </KeyInfo>
            </Signature>
            <Subject>
                <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">xxxxxxxx</NameID>
                <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer" />
            </Subject>
            <Conditions NotBefore="2020-07-01T14:10:26.357Z"
                        NotOnOrAfter="2020-07-02T00:10:26.357Z"
                        >
                <AudienceRestriction>
                    <Audience>http://xxxxxxx.xxxxxxxx.com/adfs/services/trust</Audience>
                </AudienceRestriction>
            </Conditions>
            <AttributeStatement>
                <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn">
                    <AttributeValue>xxxxxxxxx</AttributeValue>
                </Attribute>
                <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress">
                    <AttributeValue>xxxxxxxxxx</AttributeValue>
                </Attribute>
            </AttributeStatement>
            <AuthnStatement AuthnInstant="2020-07-01T14:10:26.342Z">
                <AuthnContext>
                    <AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</AuthnContextClassRef>
                </AuthnContext>
            </AuthnStatement>
        </Assertion>
    </t:RequestedSecurityToken>
</t:RequestSecurityTokenResponse>

WS-Fed -> SAML(缺少 UPN 和电子邮件):

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
                ID="_59eef1fa-81c5-4ede-8538-6caf4dbdf480"
                Version="2.0"
                IssueInstant="2020-07-01T14:10:26.698Z"
                Destination="xxxxxxxxx/adfs/ls/"
                Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified"
                InResponseTo="id-7052d47f-3df0-4d49-8ddf-673603bccb8e"
                >
    <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">xxxxxxxx/adfs/services/trust</Issuer>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
            <ds:Reference URI="#_59eef1fa-81c5-4ede-8538-6caf4dbdf480">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
                <ds:DigestValue>iia3AYaxxx8UoxILqjhsxkgeO4rXqPk9Jil1t0jUbLU=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>xxxxxxxx</ds:SignatureValue>
        <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <ds:X509Data>
                <ds:X509Certificate>xxxxxxxxxxxxxxxxxx</ds:X509Certificate>
            </ds:X509Data>
        </KeyInfo>
    </ds:Signature>
    <samlp:Status>
        <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Responder" />
    </samlp:Status>
</samlp:Response>

有没有人遇到过类似的?

“urn:oasis:names:tc:SAML:2.0:status:Responder”是错误状态。只有在成功时,SAML 响应才会包含一个 SAML 断言,其中包含各种声明作为 SAML 主题和 SAML 属性。

检查 ADFS 服务器上的 Windows 事件日志。将有一个或多个与此错误相关的错误事件。这很可能是某种配置错误。

听起来你没有通过声明。

您需要 WS-Fed CP 端的直通规则和 SAML RP 端的同一组直通规则。

由于 WS-Fed 不使用 NameID,您可能还必须在 SAML 端使用例如电子邮件或 UPN。

错误是 IdentityServer4 默认在 WsFederation 消息中生成 SAML 2.0 令牌,而不是 SAML 1.1。在应用程序发起 WsFederation SignIn 请求并自行提取 SAML 令牌之前,一切都运行良好,但是当应用程序发送 SAML SingIn 请求时,ADFS 必须提取 SAML 令牌,但 ADFS 仅适用于 SAML 1.1 版本。因此,作为一种解决方案,我在 IdentityServer4 中将令牌版本从 SAML 2.0 切换到 SAML 1.1 并开始工作。

namespace IdentityServer4.WsFederation
{
    public class WsFederationOptions
    {
        //public string DefaultTokenType { get; set; } = WsFederationConstants.TokenTypes.Saml2TokenProfile11; // was
        public string DefaultTokenType { get; set; } = WsFederationConstants.TokenTypes.OasisWssSaml11TokenProfile11; // working way
       ...
    }
}