【问题标题】:can't remove user claim in asp Identity无法删除 asp Identity 中的用户声明
【发布时间】:2017-12-11 13:00:35
【问题描述】:

我尝试在我的服务中更新用户声明,首先我应该删除这样的声明:

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 错误。
我到底做错了什么?

【问题讨论】:

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


    【解决方案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】:

      我有一个解决办法。简单地使用 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);
          }
      

      【讨论】:

      • 真的有用吗?或者您在尝试删除声明时是否停止出现错误?因为当我尝试它时,我所有的旧声明仍然存在。
      【解决方案3】:

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

      【讨论】:

      • 这可能是一个很好的答案,但该链接已失效,并且似乎从未在 Archive.org 上成功存档。请不要只引用链接
      猜你喜欢
      • 2014-03-05
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      相关资源
      最近更新 更多