Uncategorized

SAML Request と Response の Decode

すみません、超小ネタですがハマったのでメモしておきます。(「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

1 reply»

Leave a Reply