AADSTS75005:请求不是有效的 Saml2 协议消息。

AADSTS75005: The request is not a valid Saml2 protocol message.

我有一个 SAML 实现,它可以与 JumpCloud、OneLogin 和其他提供商一起正常工作,但事实证明与 Microsoft Azure AD 的集成很困难。我们收到错误

AADSTS75005: The request is not a valid Saml2 protocol message. 

每当我们发送请求时。我已经尝试了提到的解决方案 here and 但都没有解决我们的问题。

我创建 SAML 请求的代码是:

Using sw As StringWriter = New StringWriter()
    Dim xws As XmlWriterSettings = New XmlWriterSettings()
    xws.OmitXmlDeclaration = True

    Dim assertionUrl As String = "OUR URL"
    Dim issuer As String = "OUR ISSUER TEXT"
    dim id as string = "_" + System.Guid.NewGuid().ToString()
    dim issue_instant as string = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")

    Using xw As XmlWriter = XmlWriter.Create(sw, xws)
        xw.WriteStartElement("samlp", "AuthnRequest", "urn:oasis:names:tc:SAML:2.0:protocol")
        xw.WriteAttributeString("ID", id)
        xw.WriteAttributeString("Version", "2.0")
        xw.WriteAttributeString("IssueInstant", issue_instant)
        xw.WriteAttributeString("ProtocolBinding", "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST")
        xw.WriteAttributeString("AssertionConsumerServiceURL", assertionUrl)

        xw.WriteStartElement("saml", "Issuer", "urn:oasis:names:tc:SAML:2.0:assertion")
        xw.WriteString(issuer)
        xw.WriteEndElement()

        xw.WriteStartElement("samlp", "NameIDPolicy", "urn:oasis:names:tc:SAML:2.0:protocol")
        xw.WriteAttributeString("Format", "urn:oasis:names:tc:SAML:2.0:nameid-format:unspecified")
        xw.WriteAttributeString("AllowCreate", "true")
        xw.WriteEndElement()

        xw.WriteStartElement("samlp", "RequestedAuthnContext", "urn:oasis:names:tc:SAML:2.0:protocol")
        xw.WriteAttributeString("Comparison", "exact")

        xw.WriteStartElement("saml", "AuthnContextClassRef", "urn:oasis:names:tc:SAML:2.0:assertion")
        xw.WriteString("urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport")
        xw.WriteEndElement()

        xw.WriteEndElement() ' RequestedAuthnContext

        xw.WriteEndElement()
    End Using

    If (format = AuthRequestFormat.Base64)
        Dim toEncodeAsBytes As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(sw.ToString())
        Return System.Convert.ToBase64String(toEncodeAsBytes)
    End If

    Return Nothing
End Using

然后我们将用户重定向到:https://login.microsoftonline.com/OUR_APP_ID/saml2?SAMLRequest= 后跟编码字符串

我对我的结果进行了 base64 解码,并将其作为原始字符串读取,XML 对我来说似乎有效。我什至采取了来自 Azure AD 的示例请求,并将我的实现硬编码到该请求,并替换了 issuer/instant/id 等。这让我相信这是我请求中的编码问题。但是,Dushyant Gill 的回答中更改的编码也没有解决我的问题。

我在其他各种论坛帖子中发现,其他软件供应商提到,当他们的客户抱怨 SAML 实施不适用于 Azure 时,他们不得不对他们的 SAML 实施进行更改 - 但我还没有这样做找出他们的决心。

如果您正在使用 HTTP 重定向绑定(

建议

We then redirect the user to

) ,则必须使用 DEFLATE 编码对 SAMLRequest 进行编码。请参阅 http://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf

的第 3.4.4 节