块长度与其补码

时间:2017-01-20 22:50:16

标签: c# saml-2.0 adfs

我正在尝试为我们拥有的网站处理重定向身份验证。我在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值的字符串替换)。

以下是我用于生成请求参数的代码,该参数将进入我的重定向网址:

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.

我试图摆弄压缩和请求对象本身的一些属性,但无济于事。任何人都有任何想法,我可以尝试这个坏男孩?

1 个答案:

答案 0 :(得分:2)

假设DeflaterOutputStream来自SharpZipLib,new DeflaterOutputStream(output)实际上会为您提供一个 ZLIB 输出流,即RFC 1950,而不是实际的DEFLATE, RFC 1951。不同之处仅在于ZLIB为DEFLATE添加了页眉和页脚,您可以使用new DeflaterOutputStream(output, new Deflater(level: Deflater.DEFAULT_COMPRESSION, noZlibHeaderOrFooter: true))在SharpZipLib中对其进行抑制。