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

 


Comments (1)

  1. I have put together a site for decoding SAML and WS Federation messages, and extracting certificate(s) from metadata: https://www.rcfed.com/

Skip to main content