【问题标题】:Can you return only the nameidentifier claim via WIF您可以通过 WIFI 仅返回 nameidentifier 声明吗
【发布时间】:2023-07-10 06:00:01
【问题描述】:

我正在开发一个使用 WIF 创建安全 Web 应用程序和 STS 的项目,并且一切正常,除了在我想返回身份的名称标识符的情况下。

在这种情况下,我收到以下 SamlAssertion 错误: “A SamlAssertion requires at least one statement”

现在有点奇怪——我正在使用标准的 xmlsoap 模式定义来定义名称标识符 (http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier),而且只有当这个声明发送错误发生。

如果我发送(例如)http://schemas.xmlsoap.org/ws/2005/05/identity/claims/email 或我编造的一个,一切正常 - 即使您更改 nameidentifier 声明的大小写(与 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameIdentifier 一起使用),它也能正常工作!

nameidentifier 是否有可能是 SAML 或 WIF 中的关键字,因此不能成为发送的唯一声明? WIF 显然允许发送单个声明,而不是单独发送名称标识符。

【问题讨论】:

    标签: asp.net wif saml


    【解决方案1】:

    nameidentifier 是否可能是 SAML 或 WIF 中的关键字

    是的。在 SAML 令牌格式中,您有一个单独的主题概念(唯一标识实体的东西)和属性概念(有关实体的信息)。

    WIF 模型将所有这些东西都表示为声明。当您将大多数声明写入 SAML 令牌时,它们会映射到 SAML 属性,但是 nameidentifier 是特殊的,它被写入为主题。

    但看起来您正在生成一个带有完全为空的 AttributeStatement 的 SAML 令牌。你确定吗?您是否使用任何类型的自定义令牌处理程序?

    我不确定,但我假设默认情况下,当 WIF 遇到仅带有名称标识符声明的 ClaimsIdentity 时,它应该在 AuthenticationStatement 和 AttributeStatement 下将此声明写为 SAML 主题,所以你的错误'得到不应该发生。

    【讨论】:

    • 感谢您的确认和对延迟的歉意 - 我解决了这个问题,但只是急于确定我的想法是否属实。出于我的目的,仅传递名称标识符就足够了,但我已经通过向令牌添加额外的声明并从那里继续来解决这个问题。干杯!
    【解决方案2】:

    就我个人而言,我从未使用过NameIdentifier 声明。用户名应使用Name 类型(http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name)传递。

    我确认您的观察 - 您不能将 NameIdentifier(无论它是什么)作为唯一声明,但您当然可以将 Name 作为唯一声明。

    【讨论】: