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