更新

2015-03-19 31 views
0

我已经使用基于声明的indentity更新

var identity = new ClaimsIdentity(new[] { 
           new Claim(ClaimTypes.Name, userContext.ReturnObject.UserName), 
           new Claim(ClaimTypes.Email, userContext.ReturnObject.EmailAddress) 
          }, "ApplicationCookie"); 

我现在想更新存储要求的用户名应用的认证存储要求(System.Security.Claims)的值。

我可以用

var identity = (ClaimsIdentity)User.Identity; 
IEnumerable<Claim> claims = identity.Claims; 

读出的值,但我无法更新。请建议。

回答

0

索赔并非旨在进行更新;他们打算成为关于身份的原子事实。然而,ClaimsIdentity类别有权以取代索赔;您需要首先找到要替换的声明,然后使用RemoveClaim从ClaimsIdentity中删除声明,然后使用AddClaim添加具有相同声明类型的替换声明。

+0

同时除去权利要求我正在一个错误“http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name:somename”无法删除。它不是这个身份的一部分,或者是由包含此身份的委托人拥有的一个声明。例如,在创建具有角色的GenericPrincipal时,Principal将拥有该声明。这些角色将通过在构造函数中传递的身份公开,但实际上并不属于身份。 RolePrincipal存在类似的逻辑。 – Rex 2015-03-19 13:14:00

+0

啊,是的,ClaimsIdentity确实有“外部”声明的概念,正如错误信息所表明的那样,这些不能被改变。这使我们回到索赔身份不是真的意味着一旦发布就更新的事实。在这种情况下,使用更新后的用户名可能会更好地服务于生成新的委托人,从而有效地模仿用户的登录,但使用新的用户名。 – 2015-03-19 13:34:00

+0

在生成新的委托人时会自动删除旧委托人 – Rex 2015-03-19 13:40:47

0

我不明白你为什么要更新的要求,但你可以尝试这样的事情由Andy

((ClaimsIdentity)identity).RemoveClaim(identity.FindFirst(ClaimTypes.Name)); 
((ClaimsIdentity)identity).AddClaim(new Claim(ClaimTypes.Name, "new_name")); 
+1

我在删除声明'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name:somename'时无法删除时出现错误。它不是这个身份的一部分,或者是由包含此身份的委托人拥有的一个声明。例如,在创建具有角色的GenericPrincipal时,Principal将拥有该声明。这些角色将通过在构造函数中传递的身份公开,但实际上并不属于身份。 RolePrincipal存在类似的逻辑。 – Rex 2015-03-19 13:13:56

0

如说做什么@Andy和@Mukesh说后,您还需要更新声明后更改认证cookie,以使更改生效。

IOwinContext context = Request.GetOwinContext(); 

var authenticationContext = context.Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie); 

authenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(
      identity, 
      authenticationContext.Properties); 

的进一步信息可以发现here