读取SAML2令牌时出现XML命名空间错误

时间:2012-06-29 16:10:17

标签: xml wif saml-2.0

我的应用程序IdP中有一个有效的SAML 2令牌:

当我尝试使用如下的WIF代码阅读时,我收到以下错误:

  

无法从'Response'元素读取带有'urn:oasis:names:tc:SAML:2.0:protocol'的BinarySecretSecurityToken命名空间的标记,带有''ValueType。如果预期此元素有效,请确保将安全性配置为使用指定了名称,名称空间和值类型的标记。

以下是我正在使用的代码以及显示失败位置的评论

        string certPath = @"G:\Projects\myAPp\SAMLHandlingTests\bin\Debug\SSO.cer";
        X509Certificate2 cert = new X509Certificate2(certPath);
        //X509Certificate2 cert = new X509Certificate2(certPath, "LetMeIn!");


        // Open the SAML
        string samlPath = @"G:\Projects\myAPp\SAMLHandlingTests\bin\Debug\SAML.xml";

        string samlRaw = File.OpenText(samlPath).ReadToEnd();

        XmlReader rdr = XmlReader.Create(samlPath);

        List<System.IdentityModel.Tokens.SecurityToken> tokens = new List<System.IdentityModel.Tokens.SecurityToken>();

        var token = new X509SecurityToken(cert);
        tokens.Add(token);

        SecurityTokenResolver resolver = 
            SecurityTokenResolver.CreateDefaultSecurityTokenResolver(
            new System.Collections.ObjectModel.ReadOnlyCollection<SecurityToken>(tokens), true);

        //Fails on next line!
        SecurityToken securityToken = System.ServiceModel.Security.WSSecurityTokenSerializer.DefaultInstance.ReadToken(rdr, resolver);

        SamlSecurityToken deserializedSaml = securityToken as SamlSecurityToken;

问题是XML命名空间异常,但我不知道如何'确保安全性配置为使用指定了名称,命名空间和值类型的令牌

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

我发现了这个问题,它是带有加密断言的SAML响应,没有类型定义如下:

收到的SAML如下:

<saml:EncryptedAssertion>

应该是什么时候

<saml:EncryptedAssertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">

当然可以在我的代码中解决这个问题,但是潜在的问题是System.Xml和WIF不会让我在没有完全有效的xml的情况下通过。

我希望这可以帮助一路上的人。