无法删除asp Identity中的用户声明

时间:2015-05-21 04:18:33

标签: asp.net asp.net-web-api asp.net-identity claims

我尝试在我的服务中更新用户声明,并且在第一次我应该删除这样的声明:

var userClaimCollection = this.AppUserManager.GetClaims(user.Id);
var toRemove = new List<Claim>();
foreach (var claim in userClaimCollection)
{
      if (claim.Type == group_role)
      {
           toRemove.Add(claim);                    
      }
}
foreach(var t in toRemove)
{
     Claim c = new Claim(group_role, t.Value);
     this.AppUserManager.RemoveClaim(user.Id, c);
}

但在RemoveClaim(user.Id,c)我收到Collection was modified; enumeration operation may not execute错误 我到底做错了什么?

3 个答案:

答案 0 :(得分:1)

我有一个解决方法。简单地使用2.2.1对我来说不起作用。我对此大肆渲染,因为它似乎很容易删除声明。但内置管理器RemoveClaim实用程序将失败。我有一个场景,其中两次声明被添加。而对于我的生活,我无法摆脱重复的索赔条目。

直到我迭代了indentity.claims并使用了TryRemoveClaim()。

此处示例:

    public async Task SignInAsync(ApplicationUser user, bool isPersistent)
    {
        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
        var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);

        foreach(Claim c in identity.Claims)
        {
            if (c.Type == "FullName" || c.Type == "AcctStatus")
            {
                identity.TryRemoveClaim(c);
            }
        }

        identity.AddClaim(new Claim("FullName", user.BF_FullName));
        identity.AddClaim(new Claim("AcctStatus", user.BF_AcctStatus));
        AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
    }

答案 1 :(得分:1)

要删除声明,请按照以下步骤进行操作

  

第1步:根据用户ID

获取声明
   var claims = await manager.GetClaimsAsync(user.Id);
  

第2步:根据提取的声明过滤所需的声明。

var lastAccessedClaim = claims.FirstOrDefault(t => t.Type == claimType);
  

步骤3:然后,最后使用removeclaim方法删除声明   用户如下所示。

 var resDelete = (lastAccessedClaim == null)? null: await manager.RemoveClaimAsync(user.Id, lastAccessedClaim);

输入以下代码以获得准确的结果。

var claims = await manager.GetClaimsAsync(user.Id);
var lastAccessedClaim = claims.FirstOrDefault(t => t.Type == claimType);

var resDelete = (lastAccessedClaim == null)? null: await manager.RemoveClaimAsync(user.Id, lastAccessedClaim);

答案 2 :(得分:0)

最后我发现我的问题是Identity 2.2.0,在更新到Identity 2.2.1之后我的问题解决了 我找到了答案here