我正在尝试将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设置。
答案 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