ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

删除用户声明

2019-10-28 15:16:08  阅读:204  来源: 互联网

标签:asp-net-identity c


我正在将ASP.NET Identity(v2)与实体框架一起使用.我正在建立一个包含多个复选框的页面,每个复选框代表一个索赔.单击按钮(在我的示例中为SavePrivileges函数),我想根据复选框的状态调整给定用户的声明,即删除未选中的声明,并添加已选中的声明.

添加声明可以正常进行.但是,我似乎无法从用户中删除版权声明.调用manager.RemoveClaim后,我收到一个InvalidOperationException消息,说该集合已更改.即使不修改user.Claims集合,我实际上也会收到此异常.

这是我的简化示例场景:

    protected void SavePrivileges(string userId)
    {
        const string claim1Type = "...";
        const string claim2Type = "...";
        const string claim1Value = "...";
        const string claim2Value = "...";

        var store = new UserStore<IdentityUser>();
        var manager = new UserManager<IdentityUser>(store);
        var user = manager.FindById(userId);

        // Lists to keep track of changes
        var removed = new List<Claim>();
        var added = new List<Claim>();

        bool claim1Checked = CheckBox1.Checked;
        bool claim2Checked = CheckBox2.Checked;

        bool claim1Possesed = user.Claims.FirstOrDefault(claim => claim.ClaimValue == claim1Value &&
                                                                  claim.ClaimType  == claim1Type) != null;
        bool claim2Possesed = user.Claims.FirstOrDefault(claim => claim.ClaimValue == claim2Value &&
                                                                  claim.ClaimType  == claim2Type) != null;

        if (claim1Checked && !claim1Possesed)
        {
            added.Add(new Claim(claim1Type, claim1Value));
        }
        else if (!claim1Checked && claim1Possesed)
        {
            removed.Add(new Claim(claim1Type, claim1Value));
        }
        // + The same for claim2...

        // Remove extra claims
        foreach (Claim claim in removed)
        {
            manager.RemoveClaim(user.Id, claim);
        }
        // Add new claims
        foreach (Claim claim in added)
        {
            IdentityUserClaim identityUserClaim = new IdentityUserClaim { ClaimType = claim.Type, ClaimValue = claim.Value };
            user.Claims.Add(identityUserClaim);
        }

        // Save the result
        var result = manager.Update(user);
        if (result.Succeeded)
        {
            store.Context.SaveChanges();
        }
    }

谢谢你的帮助.

解决方法:

我终于找到了解决方案,但是,它绝不是一成不变的.如果有人提出更好的解决方案,我仍然很高兴看到它.

foreach (Claim claim in removed) {
    var claimCollection = store.Context.Entry(user).Collection(u => u.Claims).CurrentValue;
    var storedClaim = claimCollection.FirstOrDefault(c => c.ClaimType == claim.Type && c.ClaimValue == claim.Value && c.UserId == user.Id);
    if (storedClaim != null)
        store.Context.Entry(storedClaim).State = EntityState.Deleted;
}

标签:asp-net-identity,c
来源: https://codeday.me/bug/20191028/1953336.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有