相关疑难解决方法(0)

如何使用C#正确准备"HTTP重定向绑定"SAML请求

我需要使用HTTP重定向绑定方法创建SP启动的SAML 2.0身份验证事务.事实证明这很容易.只需获取IdP URI并连接单个查询字符串参数即可 SAMLRequest.param是xml的编码块,用于描述SAML请求.到现在为止还挺好.

将SAML转换为查询字符串参数时出现问题.我相信这个准备过程应该是:

  1. 构建SAML字符串
  2. 压缩此字符串
  3. Base64编码字符串
  4. UrlEncode字符串.

SAML请求

<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>
Run Code Online (Sandbox Code Playgroud)

代码

private 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我怀疑压缩是某种程度上的责任.我正在使用SharpZipLibDeflaterOutputStream类,它应该实现一个行业标准的deflate算法,所以也许这里有一些设置我错了?

可以使用此SAML2.0调试器(其有用的在线转换工具)测试编码输出.当我使用这个工具解码我的输出时,它是无意义的.

因此,问题是:您是否知道如何将SAML字符串转换为正确放气和编码的SAMLRequest查询参数?

谢谢 …

c# sharpziplib saml-2.0

19
推荐指数
2
解决办法
2万
查看次数

使用Deflate压缩和解压缩字符串

我需要压缩和解压缩字符串

这是代码:

public static byte[] ZipStr(String str)
{
    using (MemoryStream output = new MemoryStream())
    using (DeflateStream gzip = new DeflateStream(output, CompressionMode.Compress))
    using (StreamWriter writer = new StreamWriter(gzip))
       {
                writer.Write(str);
                return output.ToArray();
       }
}
Run Code Online (Sandbox Code Playgroud)

public static string UnZipStr(byte[] input)
{
    using (MemoryStream inputStream = new MemoryStream(input))
    using (DeflateStream gzip = new DeflateStream(inputStream, CompressionMode.Decompress))
    using (StreamReader reader = new StreamReader(gzip))
       {
        reader.ReadToEnd();
        return System.Text.Encoding.UTF8.GetString(inputStream.ToArray());
       }
}
Run Code Online (Sandbox Code Playgroud)

似乎UnZipStr方法中存在错误.有人能帮助我吗?

.net c# deflatestream

15
推荐指数
1
解决办法
3万
查看次数

标签 统计

c# ×2

.net ×1

deflatestream ×1

saml-2.0 ×1

sharpziplib ×1