我如何阅读SAML响应?

时间:2016-10-10 03:15:34

标签: c# asp.net saml-2.0 adfs2.0

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

来获取它

我尝试了什么:

我尝试从SAMLResponse查询字符串参数打印值(我在google搜索后发现了这个。所以不确定它是如何工作的。)

ClaimsPrincipal claimsPrincipal = System.Threading.Thread.CurrentPrincipal as ClaimsPrincipal;

Response.Write("Is user Authenticated = " + claimsPrincipal.Identity.IsAuthenticated.ToString());

我认为:错误

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响应并对用户进行身份验证?

2 个答案:

答案 0 :(得分:0)

如果您的SAML配置为加密令牌,则无法访问证书就无法读取它。

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

而不是自己动手使用像Kentor这样的SAML灵巧的侧边堆栈,它将为您完成所有工作。

答案 1 :(得分:0)

我遇到了同样的问题,结果发现ADFS正在发送压缩的Logout Response。使用以下内容进行解压缩:

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();