簡體   English   中英

在 C# .NET 4.5 中使用 SAML 2.0

[英]Working with SAML 2.0 in C# .NET 4.5

我正在嘗試使用純 .NET(沒有外部類、控件、助手)來創建 SAML 消息。 我在互聯網上找到了一些代碼; 這就是我所擁有的:

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;

}

這是我用來獲取 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
    );
}

這似乎會奏效。 但是,生成的消息是 SAML 版本 1.0 - 我需要使用 2.0。

我知道我可以做一些草率的工作並在這里和那里替換一些值,這個系統可以正常工作。 消息中的差異很小,版本是最重要的。 我很難找到有關 .NET 的 SAML 2.0 的信息。 我知道 SAML 2.0 最近已在 .NET 中實現。 我正在使用 Framework 4.5,所以我應該可以訪問它。 SamlAssertion 的 MSDN 頁面說“majorVersion”是一個常量,始終設置為“1”。

我猜我可以使用另一個命名空間,但我還沒有找到它。 我的要求只是獲取 XML SAML 消息。 我不需要用 X509 簽名,我不需要令牌。 只是 SAML XML 消息。

同樣,這是一個試圖找出如何在本機 .NET 中執行此操作的問題。 我找到了幾個 SAML 助手和大量關於如何手動構建消息的代碼——我正在嘗試找到正確的解決方案(如果存在)。

編輯:我發現我可以使用 Saml2Assertion。 但是,我現在無法找到將 SAML 消息寫入 xml 的方法。

EDIT2:我找到了如何將 Saml2Assersion 對象寫入 xml。 遺憾的是,它沒有保留 SAML 語法,它以純 XML 編寫,沒有<saml>標記。

.NET 4.5 內置了 WIF(Windows Identity Foundation)。 這現在支持 SAML 2.0。 要使用 SAML 2.0,只需使用 .NET 4.5。 類名是 Saml2XXXX(其中 XXXX 是令牌、斷言、序列化程序等)這是 SAML 2.0 斷言的鏈接:http: //msdn.microsoft.com/en-us/library/microsoft.identitymodel.tokens.saml2。 saml2assertion.aspx

這將創建一個 SAML 2.0 斷言對象。 要獲取 XML,這是我使用的代碼:

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

這會將您的斷言對象序列化為 XML。 這是我遇到問題的地方。 將創建的 XML 不包含 saml 命名空間(例如<saml:Assertion> )。 我無法找到解決方案,因此必須使用Replace("<", "<saml:")

那是因為 Saml2Assertion 指的是令牌而不是協議。

WIF 中使用的 SAML 令牌是 1.0 令牌。

.NET 中沒有 SAML 2 協議支持。

SAML 2 有一個 WIF CTP ,但它已經很久沒有升級了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM