【问题标题】:Block length does not match with its complement块长度与其补码不匹配
【发布时间】: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。

标签: c# saml-2.0 adfs


【解决方案1】:

假设 DeflaterOutputStream 来自 SharpZipLib,new DeflaterOutputStream(output) 实际上会给你一个 ZLIB 输出流,即 RFC 1950,实际上不是 DEFLATE,来自 RFC 1951。不同之处仅在于 ZLIB 在 DEFLATE 中添加了页眉和页脚,您可以在 SharpZipLib 中使用 new DeflaterOutputStream(output, new Deflater(level: Deflater.DEFAULT_COMPRESSION, noZlibHeaderOrFooter: true)) 将其隐藏。

【讨论】:

  • blogs.msdn.microsoft.com/bclteam/2007/05/16/… 展示了如何去除 ZLIB 页眉和页脚,以便 DeflateStream 可用于剩余的 Deflate 数据。
  • @jnm2 天哪,谢谢。发现剥离标头和校验和允许 .Net DeflateStream 工作为我们节省了几天走错路的时间,假设文件被邪恶的开源 Java 压缩库损坏了。
猜你喜欢
  • 2018-02-22
  • 2016-08-31
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2020-05-30
  • 1970-01-01
相关资源
最近更新 更多