Asp.Net Identity 2.0 UserManager.RemoveClaim throws Collection已修改异常

时间:2015-05-04 22:34:35

标签: asp.net-identity

我正在使用Asp.Net Identity(2.0)的实体框架实现实现专门的用户维护系统。

我有一个用Claims实现的用户属性。当我尝试编辑它时,我正在做一个

UserManager.RemoveClaimAsync(user.Id, new Claim(claimType, oldClaimValue));

后跟

UserManager.AddClaimAsync(user.Id, new Claim (claimType, newClaimValue));

RemoveClaim调用抛出InvalidOperationException - “集合已被修改;枚举操作可能无法执行”。

使用Reflector查看UseStore.RemoveClaimAsync方法的代码(实际上最终由UserManager中的状态机调用),你可以肯定地看到它将抛出该异常。

在Reflector的渲染中,它看起来像这样:

foreach (TUserClaim local in enumerable)
{
    this._userClaims.Remove(local);
}

但是,从上面看,有两个分支构造了enumerable,在其中一个分支中,它是由this._userClaims构造的。因此,如果您修改this._userClaims,则表示您正在修改正在枚举的集合。

我找不到删除用户声明的方法,但未成功。我确信这不是一个不常见的操作,所以我很惊讶我通过谷歌搜索无法发现与此问题相关的任何内容。

我也尝试过

user.Claims.Remove(new IdentityUserClaim() { ClaimType = claimType, ClaimValue= oldClaimValue,  UserId = user.Id});
UserManager.Update(user);

但是在Update上抛出一个无法解释的验证错误(UserId是必填字段 - 但用户对象中没有UserId,并且所有具有userId字段的子对象都是空列表,或者UserId已设置。)

有没有人遇到过这种情况,或者是否有人指向可能帮助我解决问题的其他资源?

感谢您的帮助。

0 个答案:

没有答案
相关问题