0

我试图在 WCF 数据服务/REST/OData 服务器的上下文中了解 WIF 的世界。我有一个在单元测试项目中运行的破解版 SelfSTS。当单元测试开始时,它会启动 WCF 服务,该服务会生成我的 SAML 令牌。这是正在生成的 SAML 令牌:

<saml:Assertion MajorVersion="1" MinorVersion="1" ... >
  <saml:Conditions>...</saml:Conditions>
  <saml:AttributeStatement>
    <saml:Subject>
      <saml:NameIdentifier Format="EMAIL">4bd406bf-0cf0-4dc4-8e49-57336a479ad2</saml:NameIdentifier>
      <saml:SubjectConfirmation>...</saml:SubjectConfirmation>
    </saml:Subject>
    <saml:Attribute AttributeName="emailaddress" AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
      <saml:AttributeValue>bob@bob.org</saml:AttributeValue>
    </saml:Attribute>
    <saml:Attribute AttributeName="name" AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
      <saml:AttributeValue>bob</saml:AttributeValue>
    </saml:Attribute>
  </saml:AttributeStatement>
  <ds:Signature>...</ds:Signature>
</saml:Assertion>

(我知道我的 NameIdentifier 的格式并不是真正的 EMAIL,这是我尚未清理的内容。)

在我的实际服务器中,我放了一些从 Pablo Cabraro / Cibrax 借来的代码。这段代码似乎运行 A-OK,尽管我承认我不明白发生了什么。我注意到,稍后在我的代码中,当我需要检查我的身份时,Thread.CurrentPrincipal.Identity它是 的一个实例Microsoft.IdentityModel.Claims.ClaimsIdentity,它具有所有属性的声明,以及一个 nameidentifier 声明,该声明具有我在 saml:Subject 中的 NameIdentifier 元素中的值。它还有一个属性NameClaimType,指向“http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name”。如果NameClaimType映射到 nameidentifier 会更有意义,不是吗?我该如何做到这一点?还是我期待名称声明的错误?

谢谢!

4

1 回答 1

1

NameClaimType 的值可以在 Web.config 中指定,允许您将其设为最适合用作 IIdentity.Name 的任何内容。

http://msdn.microsoft.com/en-us/library/system.security.claims.claimsidentity.nameclaimtype.aspx

NameClaimType 属性指定用于为此身份提供名称的声明类型 (Claim.Type)。该名称是通过 Name 属性访问的。

http://msdn.microsoft.com/en-us/library/ee517298.aspx状态

ClaimsIdentity.NameClaimType。NameClaimType 属性旨在用于接收方选择用于 IIdentity.Name 的声明值。

也就是说,它允许 Name 属性表示在给定情况下最有意义的任何内容 - 这可能通常是 nameidentifier 声明类型,尽管在您的情况下它被设置为 name。

于 2012-08-28T17:01:19.937 回答