c# - 如何添加简单的用户角色 - ASP.NET MVC C#

标签 c# asp.net asp.net-mvc

我是 ASP.NET MVC 的新手,我一直在研究许多添加用户角色的不同方法 对于我的 ASP.NET MVC 站点。我想使用在您创建新的 ASP.NET MVC 项目时自动为您创建的用户数据库。

包含表格:

  • AspNetRoles
  • AspNetUserClaims
  • AspNetUserLogins
  • AspNetUserRoles
  • AspNetUsers

我一直在看一些教程,我认为这对初学者来说有点雷区。

我只想做这样的事情:

[Authorize(Roles = "admin")]
public ActionResult Index()
{
    Return View();
}

因此具有管理员角色的用户可以访问索引页面。

最佳答案

第一步是创建admin 角色。这很简单:

context.Roles.Add(new IdentityRole { Name = "admin" });
context.SaveChanges();

将角色添加到现有用户:

var role = context.Roles.SingleOrDefault(m => m.Name == "admin");
user.Roles.Add(new IdentityUserRole { RoleId = role.Id });

这两个步骤都可以而且应该在 Migrations\Configuration.csSeed 方法中处理,同时创建任何应该是管理员的初始用户。

对于管理员向其他用户添加角色的能力,您已经完成了第一步:使用 [Authorize(Roles = "admin")] 保护操作。

接下来,您需要一个 View 模型来与您的用户一起工作。类似于以下内容:

public class UserViewModel
{
    // User properties you'd like to edit goes here

    public List<int> SelectedRoleIds { get; set; }

    public IEnumerable<SelectListItem> RoleChoices { get; set; }
}

您需要将您的 ApplicationUser 映射到/从该 View 模型。然后,您需要在 UserViewModel 中手动填充两个角色属性:

RoleChoices 应该是所有可用角色的可枚举:

model.RoleChoices = context.Roles.Select(m => new SelectListItem
{
    Value = m.Id,
    Text = m.Name
});

SelectedRoleIds 应该是当前分配给用户的所有角色的 ID 列表:

model.SelectedRoleIds = user.Roles.Select(m => m.RoleId);

然后,在您看来,您将构造您的多选:

@Html.ListBoxFor(m => m.SelectedRoleIds, Model.RoleChoices)

创建新用户时,您可以直接在帖子上简单地设置用户的角色:

user.Roles = model.SelectedRoleIds.Select(m => new IdentityUserRole { RoleId = m });

编辑现有用户时,必须格外小心,因为如果您为同一用户保存相同的角色 ID 两次,则会出现完整性错误。首先,您需要删除所有已取消选择的角色:

user.Roles.Where(m => !model.SelectedRoleIds.Contains(m.RoleId))
    .ToList().ForEach(role => user.Roles.Remove(role));

然后,您需要添加任何新选择的角色:

var existingUserRoles = user.Roles.Select(m => m.RoleId);
model.SelectedRoleIds.Except(existingUserRoles)
    .ToList().ForEach(roleId => user.Roles.Add(new IdentityUserRole
    {
        RoleId = roleId
    }));

关于c# - 如何添加简单的用户角色 - ASP.NET MVC C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28281940/

相关文章:

c# - 从 CRM 门户 (2011) 保存相关属性(Lead_PhoneCall 事件)时出错?

Javascript 更改 asp :textbox visible property to true

javascript - 绑定(bind)后获取kendo scheduler数据源

php - 哪个 PHP MVC 项目与 ASP.NET MVC 最相似?

c# - 捆绑后未将 Jquery UI css 添加到我的元素中

c# - 如何从输出过程类中读取最后一行?

c# - LINQ2SQL 或 Entity Framework 或企业库?

asp.net - 什么是 ASP.NET MVC?

css - 将不同的 CSS 链接到 ASP.Net 中的多语言网站?

javascript - 绑定(bind)下拉(选择)列表的初始/默认值