У меня есть реализация SAML, которая прекрасно работает с JumpCloud, OneLogin и другими поставщиками, однако интеграция с Microsoft Azure AD оказывается сложной.Мы получили ошибку
AADSTS75005: The request is not a valid Saml2 protocol message.
Всякий раз, когда мы отправляем наши запросы.Я пробовал решения, упомянутые здесь и здесь , но ни одна из них не решает проблему для нас.
Мой код для создания запроса 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 и жестко запрограммировал мою реализацию с замененным издателем / instant / id и т. Д. Это наводит меня на мысль, что это проблема кодирования в моем запросе.Тем не менее, измененная кодировка в ответе Душиант Джилла также не решает мою проблему.
Я нашел другие сообщения на форуме, где другие поставщики программного обеспечения упоминали, что им приходилось вносить изменения в свои реализации SAML, когда их клиентыжаловались, что это не работает с Azure - однако мне еще предстоит выяснить, какое у них было разрешение.