我需要使用HTTP重定向绑定方法创建SP启动的SAML 2.0身份验证事务.事实证明这很容易.只需获取IdP URI并连接单个查询字符串参数即可 SAMLRequest.param是xml的编码块,用于描述SAML请求.到现在为止还挺好.
将SAML转换为查询字符串参数时出现问题.我相信这个准备过程应该是:
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)
我怀疑压缩是某种程度上的责任.我正在使用SharpZipLib的DeflaterOutputStream类,它应该实现一个行业标准的deflate算法,所以也许这里有一些设置我错了?
可以使用此SAML2.0调试器(其有用的在线转换工具)测试编码输出.当我使用这个工具解码我的输出时,它是无意义的.
因此,问题是:您是否知道如何将SAML字符串转换为正确放气和编码的SAMLRequest查询参数?
谢谢 …
我需要压缩和解压缩字符串
这是代码:
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方法中存在错误.有人能帮助我吗?