3

我有一个 SAML 断言,我希望使用 .Net 在 .Net 中进行身份验证WSSecurityTokenSerializer

我有钥匙链和 SAML XML,尽管有一些问题

首先,我从 HTTPS POST 获得 SAML 断言:

// spec says "SAMLResponse=" 
string rawSamlData = Request["SAMLResponse"];

// read the base64 encoded bytes
byte[] samlData = Convert.FromBase64String(rawSamlData);

// read back into a UTF string
string samlAssertion = Encoding.UTF8.GetString(samlData);

// get the SAML data in an XML reader
var assertionPostStream = new StringReader(samlAssertion);
var reader = XmlReader.Create(assertionPostStream);

然后我得到我的 IdP 提供的密钥:

// get the key data
byte[] certificateData = System.IO.File.ReadAllBytes("myKeys.p7b");

// decode the keys
var cms = new SignedCms(SubjectIdentifierType.IssuerAndSerialNumber);
cms.Decode(certificateData);

// we have a keychain of X509Certificate2s, we need a collection of tokens
var certificatesAsTokens =
    from X509Certificate2 cert in cms.Certificates
    select new X509SecurityToken(cert) as SecurityToken;

// get a token resolver
var tokens = new ReadOnlyCollection<SecurityToken>(
    certificatesAsTokens.ToList());
var resolver = SecurityTokenResolver.CreateDefaultSecurityTokenResolver(
    tokens, true);

最后我在这里抛出一个错误:

// use the WS Security stuff to parse the reader
var securityToken = WSSecurityTokenSerializer.
    DefaultInstance.ReadToken(reader, resolver) as SamlSecurityToken;

调用时ReadToken出现以下错误:

无法从具有 BinarySecretSecurityToken 的“urn:oasis:names:tc:SAML:2.0:protocol”命名空间的“Response”元素中读取令牌,并带有“”ValueType。如果预计此元素有效,请确保将安全性配置为使用指定名称、命名空间和值类型的令牌。

我的 SAML XML 开头为:

<Response xmlns="urn:oasis:names:tc:SAML:2.0:protocol" ...

很明显,我Response在命名空间中有一个元素urn:oasis:names:tc:SAML:2.0:protocol

知道这里有什么问题/遗漏吗?

4

1 回答 1

5

您似乎收到了 SAML2 响应。尽管在 .NET 4.5 中支持 SAML2,但不幸的是只支持断言——而不是协议本身(包括响应消息)。

要在 .NET 中处理 SAML2 响应,您必须:

  1. 验证整个响应消息的签名。
  2. 提取消息的断言部分。
  3. 用 读取令牌Saml2SecurityTokenHandler.ReadToken()
  4. 使用 验证令牌Saml2SecurityTokenHandler.DetectReplayedToken()
  5. 验证令牌Saml2SecurityTokenHandler.ValidateConditions()
  6. 用于Saml2SecurityTokenHandler.CreateClaims()创建声明标识。

不幸的是,这些方法中的大多数都受到保护,但是您可以继承Saml2SecurityTokenHandler并访问它们。

在Sustainsys.Saml2项目的Saml2Response类中可以找到一个完整的工作示例。

于 2013-12-31T13:51:31.203 回答