我有一个SAML实现,可以与JumpCloud,OneLogin和其他提供程序很好地兼容,但是事实证明与Microsoft Azure AD集成非常困难。我们收到了错误
AADSTS75005: The request is not a valid Saml2 protocol message.
每当我们发送请求时。我已经尝试过here和here中提到的解决方案,但都没有为我们解决问题。
用于创建SAML请求的代码是通过以下Javascript在新窗口中打开的:
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中的Request示例为例,并用替换的issuer / instant / id等对我的实现进行了硬编码。这使我相信这是我的请求中的编码问题。但是,Dushyant Gill答案中更改的编码也无法解决我的问题。
我发现了许多其他论坛帖子,其他软件供应商都提到,当客户抱怨其不适用于Azure时,他们不得不对SAML实施应用更改-但是我还没有找到什么他们的决议是。
答案 0 :(得分:1)
如果您使用的是HTTP重定向绑定(建议由
然后我们将用户重定向到
),则必须使用DEFLATE编码对SAMLRequest进行编码。请参阅http://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf
的3.4.4节