Pertanyaan Cara menguraikan permintaan pernyataan SAML di .Net


Saya mencoba menerapkan solusi SSO SAML di .Net, tetapi saya mengalami masalah saat mengurai pernyataan.

Saya memiliki pernyataan sampel (sepertinya byte[] data sebagai teks) dan yang terkait .p7b mengajukan.

Saya ingin memuat kunci dari .p7b dan dekripsi pernyataan ke dokumen XML.

Sejauh ini saya pikir saya sedang membaca kunci dengan benar:

// get the key data
byte[] certificateData = System.IO.File.ReadAllBytes("myKeys.p7b");

// decode the keys
var cms = new SignedCms(SubjectIdentifierType.IssuerAndSerialNumber);
cms.Decode(certificateData);

var samlCertificates = cms.Certificates;

Lalu saya mencoba menguraikan pernyataan saya mendapatkan masalah:

// we have a keychain of X509Certificate2s, we need a collection of tokens
var certificatesAsTokens =
    from X509Certificate2 cert in samlCertificates
    select new X509SecurityToken(cert) as SecurityToken;

// get a token resolver
var tokens = new ReadOnlyCollection<SecurityToken>(
    certificatesAsTokens.ToList());
var resolver = SecurityTokenResolver.CreateDefaultSecurityTokenResolver(
    tokens, true);

// get the SAML data in an XML reader
var reader = XmlReader.Create(assertionPostStream);

// use the WS Security stuff to parse the reader
var securityToken = WSSecurityTokenSerializer.
    DefaultInstance.ReadToken(reader, resolver) as SamlSecurityToken;

Pernyataan terakhir itu mengeluarkan pengecualian, menyatakan bahwa itu tidak dapat mengurai konten XML.

Saya pikir ini berarti saya kehilangan langkah mendekripsi pernyataan - mendapatkan byte[] sebagai teks dikonversi ke dokumen XML format SAML.

Ada yang tahu cara menambahkan langkah ini? Apakah saya kehilangan sesuatu yang lain?


5
2018-05-23 15:37


asal


Jawaban:


Saya sudah tahu ini - saya kehilangan bagian dari spesifikasi SAML.

Pernyataan itu dikirim (agak aneh, karena tidak dienkripsi) sebagai data base64, dan itu menjadi URL yang dikodekan dua kali seperti yang dikirim.

Jadi menambahkan langkah ini memberi kita pernyataan yang valid:

// spec says "SAMLResponse=" 
string rawSamlData = Request["SAMLResponse"];

// the sample data sent us may be already encoded, 
// which results in double encoding
if (rawSamlData.Contains('%'))
{
    rawSamlData = HttpUtility.UrlDecode(rawSamlData);
}

// read the base64 encoded bytes
byte[] samlData = Convert.FromBase64String(rawSamlData);

// read back into a UTF string
string samlAssertion = Encoding.UTF8.GetString(samlData);

Itu otentikasi masih tidak berfungsi, tetapi sekarang saya memiliki XML yang valid jadi itu masalah yang berbeda.


12
2018-05-24 09:41