【问题标题】:Identity Model Claims With XML Characters Within Them带有 XML 字符的身份模型声明
【发布时间】:2011-07-22 19:55:37
【问题描述】:

我想做类似的事情

 outputIdentity.Claims.Add(new Claim("Claim1", "<test>Hi</test>"))

但是响应头中的安全节点本身显示为

<Attribute Name="Claim1"><AttributeValue>&lt;test&gt;Hi&lt;/test&gt;</AttributeValue></Attribute>

我知道它们是要翻译的保留 XML 字符,但我不能在我的属性中指定我想要那个节点结构吗?

注意:我也尝试将它包装在 CDATA 中,但它也会序列化该标签。当我替换翻译后的字符时,它可以工作。

【问题讨论】:

  • 请澄清您在哪里看到“请求显示为”&amp;lt; 等,即作为格式正确的 XML 文档:在调试器中?在实际索赔价值中?通过 HTTP 向/从浏览器传输?别处?换句话说,为什么这是一个问题?我希望确切地看到 XML 从基于 WIF 的 STS 通过浏览器发送到声明感知 Web 应用程序。

标签: wif saml


【解决方案1】:

安全令牌的序列化由SecurityTokenHandler(在您的情况下可能是Saml11SecurityTokenHandler)完成。

如果您想自定义序列化,您必须通过扩展 Saml11SecurityTokenHandler 类来覆盖默认行为:

class CustomHandler : Saml11SecurityTokenHandler
{
    public Saml11SecurityTokenHandler()
      : base()
    {
    }

    public Saml11SecurityTokenHandler(SamlSecurityTokenRequirement samlSecurityTokenRequirement)
      : base(samlSecurityTokenRequirement)
    {
    }

    public Saml11SecurityTokenHandler(XmlNodeList customConfigElements)
      : base(customConfigElements)
    {
    }

    protected override void WriteAttribute(XmlWriter writer, SamlAttribute attribute)
    {
        // your code here
    }
}

您还必须在 web.config 文件中添加自定义安全令牌处理程序:

<securityTokenHandlers>
  <add type="Your.Namespace.CustomHandler, Your.Dll.Name, Version=1.0.0.0, Culture=neutral" />
</securityTokenHandlers>

编辑:删除&lt;clear /&gt;

【讨论】:

  • 我开始走这条路,但是我实现的任何类型的 SecurityTokenHandler 都给了我一个 The token Serializer cannot serialize 'Microsoft.IdentityModel.Tokens.SessionSecurityToken'
  • 只需从 securityTokenHandler 部分中删除 &lt;clear /&gt;。我相应地编辑了我的答案。
【解决方案2】:

您可以尝试将值包装在 CDATA 部分中吗?作为:

&lt;![CDATA[&lt;test&gt;Hi&lt;/test&gt;]]&gt;
不确定您的 SecurityTokenHandler 类是否能正确处理,但值得一试,而且比引入自定义处理程序更容易。

【讨论】:

    猜你喜欢
    • 2015-09-14
    • 2012-02-25
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多