【发布时间】:2017-01-20 22:50:16
【问题描述】:
我正在尝试为我们拥有的网站处理重定向身份验证部分。我在 Server2012 R2 上配置了 ADFS 来处理这个问题。我使用我们域中的 URL 设置依赖方信任,我从中发送请求。我将端点添加回它们来自的特定页面。
基本上,我在这里拿这些东西:How do I correctly prepare an 'HTTP Redirect Binding' SAML Request using C#
尝试通过简单的 SAML 请求令牌发送。
public static string SAMLRequest = @"<samlp:AuthnRequest
xmlns:samlp=""urn:oasis:names:tc:SAML:2.0:protocol""
xmlns:saml=""urn:oasis:names:tc:SAML:2.0:assertion""
ID=""{0}""
Version=""2.0""
AssertionConsumerServiceIndex=""0""
AttributeConsumingServiceIndex=""0"">
<saml:Issuer>URN:xx-xx-xx</saml:Issuer>
<samlp:NameIDPolicy
AllowCreate = ""true""
Format=""urn:oasis:names:tc:SAML:2.0:nameid-format:transient"" />
</samlp:AuthnRequest>";
这是我作为 C# 字符串发送的模板 URL(用于转义字符和 ID 值的字符串替换)。
这是我用来生成进入我的重定向 URL 的请求参数的代码:
public static string GetSAMLHttpRedirectUri(string idpUri)
{
var saml = string.Format(SAMLRequest, Guid.NewGuid());
var bytes = Encoding.UTF8.GetBytes(saml);
using (var output = new MemoryStream())
{
using (var zip = new DeflaterOutputStream(output))
{
zip.Write(bytes, 0, bytes.Length);
}
var base64 = Convert.ToBase64String(output.ToArray());
var urlEncode = HttpUtility.UrlEncode(base64);
return string.Concat(idpUri, "?SAMLRequest=", urlEncode);
}
}
当一切都说完了,页面将我重定向到适当的端点,令牌 base64 编码正确。嗯,有点正确。
在 AD FS 方面,我在页面上收到一个错误,然后它就停止了身份验证。查看 AD FS 的事件查看器,它给了我这个神秘的错误:
System.IO.InvalidDataException: Block length does not match with its complement.
我试过摆弄请求对象本身的压缩和一些属性,但无济于事。有人有什么想法可以让我试试这个坏男孩吗?
【问题讨论】:
-
您手动创建 saml 2.0 请求是否有原因?
-
我没有看到可以让我轻松构建用于重定向的 SAML 请求令牌的库。如果你知道一个好的,我会全神贯注。
-
重点是,与 2.0 相比,支持 Saml 1.1。这就是为什么我问你为什么选择 2.0。