Я пытаюсь использовать чистый .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 для .NET. Я знаю, что SAML 2.0 недавно был внедрен в .NET. Я использую Framework 4.5, поэтому у меня должен быть доступ к нему. На странице MSDN для SamlAssertion говорится, что "majorVersion" является константой, всегда установленной в "1".
Я предполагаю, что есть другое пространство имен, с которым я мог бы работать, но я его не нашел. Мое требование - просто получить сообщение XML SAML. Мне не нужно подписываться с X509, мне не нужен токен. Просто XML-сообщение SAML.
Опять же, это вопрос, пытающийся выяснить, как это сделать в native.NET. Я нашел несколько помощников SAML и много кода о том, как создать сообщение вручную - я пытаюсь найти решение CORRECT, если оно существует.
EDIT: Я нашел, что могу использовать Saml2Assertion. Тем не менее, я не могу найти способ получить сообщение SAML, написанное в xml сейчас.
EDIT2: Я нашел, как написать объект Saml2Assersion в xml. К сожалению, он не поддерживает синтаксис SAML, он записывает в чистый XML без тегов <saml>
.