在C#.NET4.5中使用SAML2.0
我正在尝试使用纯.NET(没有外部类、控件和助手)创建SAML消息。我在互联网上找到了一些代码;这就是我所拥有的:在C#.NET4.5中使用SAML2.0,c#,.net,saml,saml-2.0,C#,.net,Saml,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.Assert
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的SAML2.0的信息。我知道SAML2.0最近被实现到了.NET中。我使用的是Framework4.5,所以我应该可以访问它。Samlasertion的MSDN页面上说“majorVersion”是一个常量,总是设置为“1”
我猜我还可以使用另一个名称空间,但我还没有找到它。
我的要求只是获取XML SAML消息。我不需要用X509签名,我不需要代币。只有SAML XML消息
同样,这是一个试图找出如何在本机.NET中实现这一点的问题。我已经找到了几个SAML帮助程序和许多关于如何手动构建消息的代码——我正在尝试找到正确的解决方案,如果它存在的话
编辑:我发现我可以使用Saml2Assertion。但是,我现在无法找到将SAML消息写入xml的方法
EDIT2:我发现了如何将Saml2Assersion对象写入xml。遗憾的是,它没有保留SAML语法,它使用纯XML编写,没有标记。这是因为Saml2Assertion引用的是令牌而不是协议 WIF中使用的SAML令牌是1.0令牌 NET中不支持SAML2协议 SAML2有一个WIF,但它已经很久没有升级了。.NET4.5内置了WIF(Windows身份基础)。现在它支持SAML2.0。 要使用SAML2.0,只需使用.NET4.5即可。类名是Saml2XXXX(其中XXXX是令牌、断言、序列化程序等),这里是指向saml2.0断言的链接: 这将创建一个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命名空间(例如
)。我找不到解决方案,所以在4.5框架中完全实现了Replace(“不正确的。SAML2(实际上是WIF)。这里有一个链接:另外,SAML2Assertion是assersion,并且有一个用于标记的Saml2Token类。到目前为止,除了缺少saml的XML命名空间之外,一切都很好。一旦我弄清楚了这一点(可能是XMLWriter问题)我会发布解决方案。看看名称空间-这是令牌而不是协议-协议列表在这里-感谢名称空间链接。我非常感谢您的回答,没有其他人回答过。我不是在寻找协议。我的问题很清楚。我引用“我不需要令牌,只需要SAML XML消息。”。"我只需要xml消息。其余的我正在处理。再次感谢!明白了。因此,您可以自己编写xml-无帮助程序类-或查看此处。这支持多种令牌,并且是开源的。如果它不支持令牌2.0的内容,它可能会给您一些线索。是的-Microsoft已从Internet上删除了堆栈。请在此处投票:In除了继承Saml2SecurityTokenHandler
来生成WriteAssertion
方法之外,您可以像这样使用WriteToken
:handler.WriteToken(writer,新的Saml2SecurityToken(断言));
我可以使用.NET 4.0并使用.NET 4.5进行身份验证吗?我有一大堆.NET 4.0库,所以升级所有库需要做很多工作。我们公司主要是一家java商店,但我是为数不多的.NET人员之一。出于好奇,有人知道java是否是“标准库/框架”吗是否有任何内置类可以使用SAML 2.0?更新的Saml2Assertion文档链接:就个人而言,我会选择使用bc库,这样可以节省时间。您可以使用这样的库来帮助您,并提供代码示例。需要添加对System.IdentityModel.dll的引用,并添加System.IdentityModel.Tokens命名空间。