我正在做一个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响应并对用户进行身份验证?
我有同样的问题,结果是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,它会为你做所有的事情。