如何读取SAML响应

本文关键字:SAML 响应 读取 何读取 | 更新日期: 2023-09-27 18:12:13

我正在做一个POC在ASP。Net for IdP发起SSO。我用ADFS登录页面上的AD凭据成功登录。但是,在我的断言页面上,如何获得SAML响应并验证用户呢?我可以使用开发人员工具看到响应,但我如何使用c#得到它?

我试过了:

我试着从SAMLResponse querystring参数打印值(我在谷歌搜索后发现了这个)。所以不确定它实际上是如何工作的)。

ClaimsPrincipal claimsPrincipal = System.Threading.Thread.CurrentPrincipal as ClaimsPrincipal;
Response.Write("Is user Authenticated = " + claimsPrincipal.Identity.IsAuthenticated.ToString());

我得到的结果是:False

Response.Write("   Current Principal  = " + System.Threading.Thread.CurrentPrincipal.ToString());

我得到这个为:System.Security.Principal.GenericPrincipal

string rawSamlData = Request["SAMLResponse"];
Response.Write("Raw data 'n");
Response.Write(rawSamlData);
rawSamlData = HttpUtility.UrlDecode(rawSamlData);
Response.Write("after url decode 'n");
Response.Write(rawSamlData);
// read the base64 encoded bytes
byte[] samlData = Convert.FromBase64String(rawSamlData);
Response.Write("after base 64 'n");
Response.Write(samlData);
// read back into a UTF string
string samlAssertion = Encoding.UTF8.GetString(samlData);
Response.Write("saml assertion 'n");
Response.Write(samlAssertion);

我得到的只是一些加密的字符串。如何将其解码为SAML响应并对用户进行身份验证?

如何读取SAML响应

我有同样的问题,结果是ADFS正在发送压缩的注销响应。使用以下命令解压:

public static Stream Decompress(this byte[] input)
{
        var output = new MemoryStream();
        using (var compressStream = new MemoryStream(input))
        using (var decompressor = new DeflateStream(compressStream, CompressionMode.Decompress))
            decompressor.CopyTo(output);
        output.Position = 0;
        return output;
}

然后你得到以下XML字符串:

            var decompressedStream = data.Decompress();
            StreamReader reader = new StreamReader(decompressedStream);
            decodedSaml = reader.ReadToEnd();

如果您的SAML配置为加密令牌,则在没有访问证书的情况下无法读取它。

否则,它就是Base64。有许多在线网站可以为您解码SAML,以便您可以看到它是什么样子的。

不要使用SAML客户端堆栈,比如Kentor,它会为你做所有的事情。