我试图在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借来了一些code。这段代码似乎运行A-OK,虽然我承认我不明白发生了什么。我注意到稍后在我的代码中,当我需要检查我的身份时,Thread.CurrentPrincipal.Identity
是Microsoft.IdentityModel.Claims.ClaimsIdentity
的一个实例,它具有所有属性的声明,加上nameidentifier声明,其值在我的NameIdentifier中saml中的元素:主题。它还有一个属性NameClaimType
,它指向“http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name”。如果NameClaimType
映射到nameidentifier会更有意义,不是吗?我该如何做到这一点?或者我期待名称声称的错误?
谢谢!
答案 0 :(得分:1)
可以在Web.config中指定NameClaimType的值,允许您将其最适合用作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。