更新存储在Claims中的值(System.Security.Claims)

时间:2015-03-19 12:42:08

标签: asp.net-mvc c#-4.0 asp.net-mvc-5 claims-based-identity

我已使用基于声明的身份

应用了身份验证
  var identity = new ClaimsIdentity(new[] {
                                new Claim(ClaimTypes.Name, userContext.ReturnObject.UserName),
                                new Claim(ClaimTypes.Email, userContext.ReturnObject.EmailAddress)
                            }, "ApplicationCookie");

现在我正在尝试更新存储在声明中的用户名。

我可以使用

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

但我无法更新。请建议。

3 个答案:

答案 0 :(得分:1)

我不明白你为什么要更新索赔,但你可以尝试像Andy所说的这样的事情

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

答案 1 :(得分:0)

索赔并未设计为更新;他们打算成为关于身份的原子事实。但是,ClaimsIdentity类能够替换声明;您需要先找到要替换的声明,然后使用RemoveClaim从ClaimsIdentity中删除声明,然后使用AddClaim添加具有相同声明类型的替换声明。

答案 2 :(得分:0)

在完成@Andy和@Mukesh所说的内容后,您还需要在更新声明后更改身份验证Cookie,以使更改生效。

IOwinContext context = Request.GetOwinContext();

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

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

可以找到更多信息here