ACS75005"请求不是有效的SAML2协议消息。"始终在使用SAML连接到Windows Azure Active Directory时显示

时间:2014-08-04 13:37:58

标签: .net azure saml-2.0

我正在尝试将Windows Azure Active Directory用作Web应用程序中的IdP。我的代码在其他SAML IdP上运行正常,但仅在Windows Azure AD中提供以下消息!!

  

登录

     

抱歉,我们在登录时遇到了麻烦。

     

我们收到了一个错误的请求。   其他技术信息:

     

追踪ID:8377e605-6b9f-47be-8547-5fce7f4285af

     

时间戳:2014-08-04 13:31:27Z

     

ACS75005:

     

请求不是有效的SAML2协议消息。

我替换了我的代码并使用了Microsoft发布的here的SAML请求,并且只替换了一些值,但仍然收到相同的错误消息!!

我的要求有什么问题?我怎样才能获得有关该消息的更多细节!

知道我的应用程序是在Windows Azure AD应用程序中定义的。

<samlp:AuthnRequest xmlns="urn:oasis:names:tc:SAML:2.0:metadata" ID="_56dbfeac-107a-46d2-b989-651f90107312" Version="2.0" IssueInstant="2014-08-04T13:28:05Z" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
  <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">SOMETHING</Issuer> 
</samlp:AuthnRequest>

修改001 在将断言编辑为Dushyant建议后,它变为:

<samlp:AuthnRequest xmlns="urn:oasis:names:tc:SAML:2.0:assertion" 
    ID="_efcebb45-5ee6-42df-ace4-a343f28f5a46"                                                 
    Version="2.0" IssueInstant="2014-08-07T06:29:09Z"                                                 
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">                                    
    <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">SOMETHING</Issuer>
</samlp:AuthnRequest>

但仍然出现同样的错误!

另请找到我正在使用here的测试项目。仅替换webconfig中AppSettings中的值以用于SAML设置。

3 个答案:

答案 0 :(得分:9)

使用

xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"

而不是xmlns =&#34; urn:oasis:names:tc:SAML:2.0:metadata&#34;

我相信您遵循了我们在此处记录的内容:http://msdn.microsoft.com/en-us/library/azure/dn195589.aspx。如果是这样,您在该文章中发现了一个错误 - 抱歉。

希望这会有所帮助。


Homam,我查看了你的代码。问题在于AuthnRequest的编码方式。我将其更改为标准的deflate编码并且有效。

public string GetAzureRequest(AuthRequestFormat format)
{
    string xml = @"<samlp:AuthnRequest xmlns=""urn:oasis:names:tc:SAML:2.0:assertion"" ID=""#ID""
                                     Version=""2.0"" IssueInstant=""#DATE""
                                     xmlns:samlp=""urn:oasis:names:tc:SAML:2.0:protocol"">
                        <Issuer xmlns=""urn:oasis:names:tc:SAML:2.0:assertion"">#ISSUER</Issuer>
                 </samlp:AuthnRequest>";

    xml = xml.Replace("#DATE", issue_instant);
    xml = xml.Replace("#ID", id);
    xml = xml.Replace("#ISSUER", appSettings.Issuer);
    xml = xml.Replace("\r\n", "");

    if (format == AuthRequestFormat.Base64)
    {
        /*COMMENTED THIS OUT*/

        //byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(requestDocument.OuterXml);
        //string result = System.Convert.ToBase64String(toEncodeAsBytes);
        //return result;


        /*ADDED THIS*/

        MemoryStream memoryStream = new MemoryStream();
        StreamWriter writer = new StreamWriter(new DeflateStream(memoryStream, CompressionMode.Compress, true), new UTF8Encoding(false));
        writer.Write(xml);
        writer.Close();
        string result = Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length, Base64FormattingOptions.None);
        return result;
    }

    return null;
}

答案 1 :(得分:0)

在Get请求中使用之前,您需要将UrlEncode(例如HttpUtility.UrlEncode(result))'结果'。

答案 2 :(得分:0)

我认为这里的命名空间不匹配...... SAMLRequest应该是这样的。

<samlp:AuthnRequest
    ID="_efcebb45-5ee6-42df-ace4-a343f28f5a46"                                                 
    Version="2.0" IssueInstant="2014-08-07T06:29:09Z"                                                 
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">                                    
    <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">SOMETHING</Issuer>
</samlp:AuthnRequest>

Issuer元素必须位于&lt; urn:oasis:name:tc:SAML:2.0:assertion&#39;的名称空间中。和&#39; urn:oasis:names:tc:SAML:2.0:protocol&#39;

的命名空间中的AuthnRequest元素

当然这需要放气+ base64编码。如果使用HttpRedirect绑定,那么在嵌入URL

之前也要对其进行urlencode