i尝试在我的服务中更新用户声明,首先我应该像这样删除声明:
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
错误。
我到底做错了什么?
按照下面给出的步骤删除声明,
步骤1:根据User Id
获取声明
var claims = await manager.GetClaimsAsync(user.Id);
步骤2:从已获取的声明中筛选需要的声明。
var lastAccessedClaim = claims.FirstOrDefault(t => t.Type == claimType);
步骤3:然后,最后使用removecclaim方法删除声明用户如下图所示。
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.1并不适合我。我绞尽脑汁,因为它似乎应该很容易删除索赔。但是内置的管理器removecclaim实用程序将失败。我有一个场景,一个索赔被添加了两次。而我无论如何也无法摆脱重复的索赔条目。
直到遍历identity。声明并使用tryremovecclaim()。
例子:
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);
}
最后我发现我的问题是Identity 2.2.0,更新到Identity 2.2.1后,我的问题解决了。
我在这里找到了答案