我希望使用纯.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中。我正在使用框架4.5,所以应该可以访问它。SamlAssertion的MSDN页面说“majorVersion”是一个常量,始终设置为“1”。
我猜还有另一个命名空间可以使用,但我还没有找到它。
我的要求只是获取XML SAML消息。我不需要用X509签名,也不需要令牌。只要SAML XML消息即可。
再次说明,这是一个试图找出如何在本地.NET中完成此操作的问题。我已经找到了几个SAML帮助程序和大量代码,介绍了如何手动构建消息-我正在尝试找到正确的解决方案,如果存在的话。
编辑:我发现我可以使用Saml2Assertion。但是,我无法找到将SAML消息写入xml的方法。
编辑2:我已经找到了如何将Saml2Assersion对象写入xml。不幸的是,它不保留SAML语法,而是以纯XML编写,没有标签。