问题读取验证使用WSSecurityTokenSerializer在.net SAML断言

问题描述 投票:3回答:1

我有一个SAML断言,我希望用WSSecurityTokenSerializer在.NET来验证。

我已经拿到了钥匙链和SAML XML,尽管a few issues

首先我从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我得到以下错误:

不能与读取从“响应”元素令牌“瓮:绿洲:名称:TC:SAML:2.0:协议”的命名空间BinarySecretSecurityToken,具有“”值类型。如果该元件被预期是有效的,确保安全性被配置成消耗与指定的名称,命名空间和值类型令牌。

我SAML XML开头:

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

所以很明显我在Response命名空间的urn:oasis:names:tc:SAML:2.0:protocol元素。

任何想法有什么错/丢失在这里吗?

.net single-sign-on x509certificate pkcs#7 saml-2.0
1个回答
5
投票

它看起来像您收到一个SAML2响应。尽管在.NET 4.5 SAML2支持,有不幸仅用于断言支持 - 不协议本身(包括响应消息)。

为了处理在.NET中,你必须在SAML2响应:

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

不幸的是大多数的这些方法是受保护的,但你也可以继承Saml2SecurityTokenHandler并获得对它们的访问。

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

© www.soinside.com 2019 - 2024. All rights reserved.