Pertanyaan Bekerja dengan SAML 2.0 dalam C # .NET 4.5


Saya mencoba menggunakan NET murni (tidak ada kelas eksternal, kontrol, pembantu) untuk membuat pesan SAML. Saya menemukan beberapa kode pada interwebs; ini yang saya punya:

private static SamlAssertion createSamlAssertion()
{
    // Here we create some SAML assertion with ID and Issuer name. 
    SamlAssertion assertion = new SamlAssertion();
    assertion.AssertionId = "AssertionID";
    assertion.Issuer = "ISSUER";
    // Create some SAML subject. 
   SamlSubject samlSubject = new SamlSubject();
    samlSubject.Name = "My Subject";

    // 
    // Create one SAML attribute with few values. 
    SamlAttribute attr = new SamlAttribute();
    attr.Namespace = "http://daenet.eu/saml";
    attr.AttributeValues.Add("Some Value 1");
    //attr.AttributeValues.Add("Some Value 2");

    attr.Name = "My ATTR Value";

    // 
    // Now create the SAML statement containing one attribute and one subject. 
    SamlAttributeStatement samlAttributeStatement = new SamlAttributeStatement();
    samlAttributeStatement.Attributes.Add(attr);
    samlAttributeStatement.SamlSubject = samlSubject;

    // Append the statement to the SAML assertion. 
    assertion.Statements.Add(samlAttributeStatement);

    //return assertion
    return assertion;

}

dan di sini adalah kode yang saya gunakan untuk mendapatkan XML:

var sb = new StringBuilder();
var settings = new XmlWriterSettings
{
    OmitXmlDeclaration = true,
    Encoding = Encoding.UTF8
};
using (var stringWriter = new StringWriter(sb))
using (var xmlWriter = XmlWriter.Create(stringWriter, settings))
using (var dictionaryWriter = XmlDictionaryWriter.CreateDictionaryWriter(xmlWriter))
{
    var samlAssertSerializer = new SamlSerializer();
    var secTokenSerializer = new WSSecurityTokenSerializer();
    assertion.WriteXml(
        dictionaryWriter,
        samlAssertSerializer,
        secTokenSerializer
    );
}

Sepertinya ini akan berhasil. Namun, pesan yang dihasilkan adalah SAML versi 1.0 - Saya perlu bekerja dengan 2.0.

Saya tahu saya dapat melakukan beberapa pekerjaan yang ceroboh dan mengganti beberapa nilai di sana-sini dan sistem ini akan berfungsi dengan baik. Ada sedikit perbedaan dalam pesan, versi menjadi yang paling penting. Saya kesulitan mencari informasi tentang SAML 2.0 untuk .NET. Saya tahu SAML 2.0 diimplementasikan ke .NET baru-baru ini. Saya menggunakan Framework 4.5 sehingga saya harus memiliki akses ke sana. Halaman MSDN untuk SamlAssertion mengatakan "majorVersion" adalah konstanta, selalu disetel ke '1'.

Saya menduga ada namespace lain yang bisa saya gunakan, tetapi saya belum menemukannya. Persyaratan saya hanya untuk mendapatkan pesan XML SAML. Saya tidak perlu mendaftar dengan X509, saya tidak perlu token. Hanya pesan XML SAML.

Sekali lagi, ini adalah pertanyaan yang mencoba mencari tahu bagaimana melakukan ini di native .NET. Saya telah menemukan beberapa pembantu SAML dan banyak kode tentang cara membuat pesan secara manual - Saya mencoba mencari solusi CORRECT, jika ada.

EDIT: Saya telah menemukan bahwa saya dapat menggunakan Saml2Assertion. Namun, saya tidak dapat menemukan cara untuk membuat pesan SAML ditulis ke xml sekarang.

EDIT2: Saya telah menemukan cara menulis objek Saml2Assersion ke xml. Sayangnya, itu tidak menyimpan sintaks SAML, ia menulis dalam XML murni tanpa <saml> tag.


32
2018-03-20 17:08


asal


Jawaban:


.NET 4.5 memiliki WIF (Windows Identity Foundation) yang dibangun di dalamnya. Ini sekarang mendukung SAML 2.0. Untuk menggunakan SAML 2.0, cukup gunakan .NET 4.5. Nama kelasnya adalah Saml2XXXX (dengan XXXX adalah token, pernyataan, serializer, dll.) Berikut adalah tautan ke SAML 2.0 Assertion: http://msdn.microsoft.com/en-us/library/microsoft.identitymodel.tokens.saml2.saml2assertion.aspx

Ini akan membuat objek SAML 2.0 Assertion. Untuk mendapatkan XML, ini adalah kode yang saya gunakan:

using System.Xml;
using System.IdentityModel.Tokens;

namespace YOUR.SPACE
{
    public class Saml2Serializer : Saml2SecurityTokenHandler
    {
        public Saml2Serializer()
        {
            Configuration = new SecurityTokenHandlerConfiguration()
                {

                };
        }

        public void WriteSaml2Assertion(XmlWriter writer, Saml2Assertion data)
        {
            base.WriteAssertion(writer, data);
        }
    }
}

Ini akan membuat serial objek pernyataan Anda ke XML. Di sinilah saya mengalami masalah. XML akan membuat TIDAK mengandung namespace saml (mis. <saml:Assertion>). Saya tidak dapat menemukan solusi untuk ini, jadi a Replace("<", "<saml:") harus digunakan.


33
2018-03-21 18:46



Itu karena Saml2Assertion mengacu pada token bukan protokol.

Token SAML yang digunakan dalam WIF adalah token 1.0.

Tidak ada dukungan protokol SAML 2 di .NET.

Ada WIF CTP untuk SAML 2 tetapi belum ditingkatkan untuk waktu lama.


4
2018-03-20 18:15