36

純粋な .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 で作業する必要があります。

ずさんな作業を行って、あちこちでいくつかの値を置き換えることができ、このシステムはうまく機能することを私は知っています。メッセージにはほとんど違いがなく、バージョンが最も重要です。SAML 2.0 for .NET に関する情報を見つけるのに苦労しています。最近、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 構文を保持せず、<saml>タグなしの純粋な XML で書き込みます。

4

2 に答える 2

36

.NET 4.5には、WIF(Windows Identity Foundation)が組み込まれています。これでSAML2.0がサポートされるようになりました。SAML 2.0を利用するには、.NET4.5を使用するだけです。クラス名はSaml2XXXX(XXXXはトークン、アサーション、シリアライザーなど)です。SA​​ML2.0アサーションへのリンクは次のとおりです:http://msdn.microsoft.com/en-us/library/microsoft.identitymodel.tokens.saml2。 saml2assertion.aspx

これにより、SAML2.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:")使用されなければなりませんでした。

于 2013-03-21T18:46:02.177 に答える
4

これは、Saml2Assertion がプロトコルではなくトークンを参照するためです。

WIF で使用される SAML トークンは 1.0 トークンです。

.NET では SAML 2 プロトコルのサポートはありません。

SAML 2 用の WIF CTPがありますが、何年もアップグレードされていません。

于 2013-03-20T18:15:35.727 に答える