web-dev-qa-db-ja.com

C#.NET 4.5でSAML 2.0を使用する

私は純粋な.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で書き込みます。

33
bugnuker

.NET 4.5にはWIF(Windows Identity Foundation)が組み込まれています。これにより、SAML 2.0がサポートされるようになりました。 SAML 2.0を使用するには、.NET 4.5を使用します。クラス名はSaml2XXXX(XXXXはトークン、アサーション、シリアライザーなど)です。SA​​ML2.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:")を使用する必要がありました。

34
bugnuker

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

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

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

SIF 2にはWIF [〜#〜] ctp [〜#〜] がありますが、長年にわたってアップグレードされていません。

4
nzpcmad