すみません、超小ネタですがハマったのでメモしておきます。(「OAuth 2 Token (JWT) の Decode」に続き。。。)
C# を使った SAML 2.0 の Request (SAMLRequest)、Response (SAMLResponse) のデコード方法です。(これまで、オンライン のデコード サイトなどを使っていたのですが、都合によりコーディングが必要になったので。。。)
OASIS の仕様を読むと、HTTP GET による HTTP Redirect Binding の場合は、query parameter の SAMLEncoding に従った Encoding をおこない、もし SAMLEncoding が省略されていた場合には、Deflate Compress によるバイト列の Base64 エンコード文字列になります。(一方、HTTP POST Binding の場合は、単純に Base64 エンコード文字列になります。)
このため、厳密には、SAMLEncoding が指定されている場合などケース・バイ・ケースになりますが、概ね、SAML Request は以下の方法で Decode できる場合が多いでしょう。
//// SAML Request Decoding (Deflate & Base64)// input = origin, result = decoded3//using System.Web;using System.IO;using System.IO.Compression;. . .string decoded1 = HttpUtility.UrlDecode(origin);byte[] decoded2 = Convert.FromBase64String(decoded1);string decoded3 = string.Empty;using (MemoryStream stream2 = new MemoryStream(decoded2)){ using (MemoryStream stream3 = new MemoryStream()) { using (StreamReader reader3 = new StreamReader(stream3)) { stream2.Position = 0L; new DeflateStream(stream2, CompressionMode.Decompress).CopyTo(stream3); stream3.Position = 0L; decoded3 = reader3.ReadToEnd(); reader3.Close(); } stream3.Close(); } stream2.Close();}Console.WriteLine(decoded3);
一方、SAML Response は HTTP POST になるので、単純に以下の通りになります。
//// SAML Response Decoding (Base64)// input = origin, result = decoded3//using System.Web;using System.Text;. . .string decoded1 = HttpUtility.UrlDecode(origin);byte[] decoded2 = Convert.FromBase64String(decoded1);string decoded3 = Encoding.ASCII.GetString(decoded2);Console.WriteLine(decoded3);
Categories: Uncategorized
I have put together a site for decoding SAML and WS Federation messages, and extracting certificate(s) from metadata: https://www.rcfed.com/
LikeLike