当前位置: 首页 > 知识库问答 >
问题:

使用asp.net身份更新用户角色

朱典
2023-03-14

我有以下问题。当使用下面的代码来更改用户的当前角色时,我收到了如下消息的异常

    [HttpPost]
    [ValidateAntiForgeryToken]
    public virtual ActionResult Edit(User user, string role)
    {
        if (ModelState.IsValid)
        {
            var oldUser = DB.Users.SingleOrDefault(u => u.Id == user.Id);
            var oldRoleId = oldUser.Roles.SingleOrDefault().RoleId;
            var oldRoleName = DB.Roles.SingleOrDefault(r => r.Id == oldRoleId).Name;
            if (oldRoleName != role)
            {
                Manager.RemoveFromRole(user.Id, oldRoleName);
                Manager.AddToRole(user.Id, role);
            }
            DB.Entry(user).State = EntityState.Modified;

            return RedirectToAction(MVC.User.Index());
        }
        return View(user);
    }

附加“模型。实体。用户”类型的实体失败,因为另一个相同类型的实体已经具有相同的主键值。如果图形中的任何实体具有冲突的键值,则使用“附加”方法或将实体的状态设置为“未更改”或“修改”时可能会发生这种情况。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态来跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“修改”。

有谁知道这个问题的好办法吗?

共有2个答案

寿元白
2023-03-14

我的角色在我的DbMigrationsConfiguration类的种子方法中进行管理,我将其重命名为:

        if (context.Roles.Any(r => r.Name == "User"))
        {
            var store = new RoleStore<IdentityRole>(context);
            var manager = new RoleManager<IdentityRole>(store);
            var role = manager.Roles.First(r => r.Name == "User");

            role.Name = "NewNameForUser";
            manager.Update(role);
        }
濮赤岩
2023-03-14

问题是您的Manager和DB使用的DbContext不同。因此,当您将数据库上下文中的用户发送给经理时,它将作为“新”用户进行处理,然后您无法将其从角色中删除。你有两条路要走。最简单的方法是从您的经理那里获取用户。

[HttpPost]
[ValidateAntiForgeryToken]
public virtual ActionResult Edit(User user, string role)
{
    if (ModelState.IsValid)
    {
        // THIS LINE IS IMPORTANT
        var oldUser = Manager.FindById(user.Id);
        var oldRoleId = oldUser.Roles.SingleOrDefault().RoleId;
        var oldRoleName = DB.Roles.SingleOrDefault(r => r.Id == oldRoleId).Name;

        if (oldRoleName != role)
        {
            Manager.RemoveFromRole(user.Id, oldRoleName);
            Manager.AddToRole(user.Id, role);
        }
        DB.Entry(user).State = EntityState.Modified;

        return RedirectToAction(MVC.User.Index());
    }
    return View(user);
}

更优雅的方法是开始使用像AutoFac这样的DI框架(https://code.google.com/p/autofac/wiki/MvcIntegration)并将DbContext设置为InstancePerApiRequest。

builder.RegisterType<YourDbContext>().As<DbContext>().InstancePerApiRequest();
 类似资料:
  • 我正在寻找一种方法来自动更新另一个用户的权限。我似乎找不到一个聪明的方法来做这件事。我能想到的唯一解决方案是每次用户访问页面时从数据库加载用户组,但这可能会对性能造成很大影响。是不是有什么明显的方法让我错过了?

  • 我在学Spring保安。 在浏览了一些教程之后,我发现其中一些使用了UserRole,而一些使用了一个实现身份验证的UserAuthentication类。我尝试实现的一个(并起作用)是创建一个自定义的MyUserDetailsService,它实现UserDetailsService,并授予权限(角色?)像这样: 我想知道用户角色和GrantedAuthorities之间有什么区别(例如,当使用

  • 这个话题让我感到难以置信的困惑。我是HTTP应用程序的新手,但需要开发一个从某处使用JSON数据的iPhone客户端。我选择了MS的Web API,因为它看起来很简单,但是当涉及到对用户进行身份验证时,事情变得相当令人沮丧。 null 这不是一个问题,而是要求提供一个具体如何做到这一点的例子。我看了以下几页: 尽管这些解释了如何处理未经授权的请求,但它们并没有清楚地演示诸如 之类的东西来请求用户凭

  • 我使用asp.net身份与索赔主体和索赔身份。标识由自定义用户管理器创建,并作为承载令牌发送给客户端。 一切正常,但是我想指示asp.net使用角色的自定义声明类型,而不是标准的System。安全。索赔。声明类型。作用(http://schemas.microsoft.com/ws/2008/06/identity/claims/role)。 有可能吗? 编辑:我想对角色构造函数使用标准的Auth

  • 我仍然对所有这些身份的东西感到困惑。 首先,我仍然不清楚角色、政策/声明之间的区别。据我所知,角色是旧的做事方式,是为了向后兼容而保留的,那么这是否意味着AspNetRoleClaims是向后兼容的一部分? 我认为我理解索赔和政策时,当将它们单独考虑时,就像政策基本上是一组必须通过的规则,并赋予更改规则的能力,而不必遍历所有代码和更改角色。 这是一个声明,基本上是一个可信的来源,为该用户提供担保(

  • 我正在尝试使用角色更新用户数据,但不幸的是,我遇到了错误。请帮助我如何解决此问题。谢谢。 我得到错误请chack 非法字符串偏移量“name” https://flareapp.io/share/Bm01YzaP 注:我使用的是spaite laravel许可 返回请求 控制器