在前面介绍中我们知道了Asp.Net Core Identity中创建用户使用到的类UserManager<IdentityUser>,同样的,创建角色我们需要使用RoleManager<IdentityRole>。

  接下来我们就来看看如何创建角色。

  先定义ViewModel

namespace StudentManagement.ViewModels
{
public class CreateRoleViewModel
{
[Required]
[Display(Name = "角色")]
public string RoleName { get; set; }
}
}

  创建AdminController

namespace StudentManagement.Controllers
{
public class AdminController : Controller
{
private readonly RoleManager<IdentityRole> roleManager;
    private readonly UserManager<ApplicationUser> userManager;
public AdminController(RoleManager<IdentityRole> roleManager, UserManager<ApplicationUser> userManager)
{
this.roleManager = roleManager;
       this.userManager = userManager;
} [HttpGet]
public IActionResult CreateRole()
{
return View();
} [HttpPost]
public async Task<IActionResult> CreateRole(CreateRoleViewModel model)
{
if (ModelState.IsValid)
{
//我们只需要指定一个不重复的角色名称来创建新角色 IdentityRole identityRole = new IdentityRole
{
Name = model.RoleName
}; //将角色保存在AspNetRoles表中 IdentityResult result = await roleManager.CreateAsync(identityRole); if (result.Succeeded)
{
return RedirectToAction("ListRoles", "Admin");
} foreach (IdentityError error in result.Errors)
{
ModelState.AddModelError("", error.Description);
}
} return View(model);
}
}

  创建视图

@model  CreateRoleViewModel

@{
ViewBag.Title = "创建新角色";
} <form asp-action="CreateRole" method="post" class="mt-3">
<div asp-validation-summary="All" class="text-danger">
</div>
<div class="form-group row">
<label asp-for="RoleName" class="col-sm-2 col-form-label"></label>
<div class="col-sm-10">
<input asp-for="RoleName" class="form-control" placeholder="Name">
<span asp-validation-for="RoleName" class="text-danger"></span>
</div>
</div> <div class="form-group row">
<div class="col-sm-10">
<button type="submit" class="btn btn-primary" style="width:auto">
创建角色
</button>
</div>
</div>
</form>

  创建完角色,我们需要显示它,在AdminController中添加下面的ListRoles方法

[HttpGet]
public IActionResult ListRoles()
{
var roles = roleManager.Roles;
return View(roles);
}

  新建ListRoles视图,既然有列表,那么就应该存在编辑和删除角色的功能

@model IEnumerable<IdentityRole>

@{
ViewBag.Title = "角色列表";
} <h1>所有角色列表</h1> @if (Model.Any())
{
<a class="btn btn-primary mb-3" style="width:auto" asp-action="CreateRole"
asp-controller="admin">添加新角色</a> foreach (var role in Model)
{
<div class="card mb-3">
<div class="card-header">
角色Id : @role.Id
</div>
<div class="card-body">
<h5 class="card-title">@role.Name</h5>
</div>
<div class="card-footer"> <form method="post" asp-action="DeleteUser" asp-route-id="@role.Id">
<a asp-controller="Admin" asp-action="EditRole"
asp-route-id="@role.Id" class="btn btn-primary">
编辑
</a> <span id="confirmDeleteSpan_@role.Id" style="display:none">
<span>你确定你要删除?</span>
<button type="submit" class="btn btn-danger">是</button>
<a href="#" class="btn btn-primary"
onclick="confirmDelete('@role.Id', false)">否</a>
</span> <span id="deleteSpan_@role.Id">
<a href="#" class="btn btn-danger"
onclick="confirmDelete('@role.Id', true)">删除</a>
</span>
</form> </div>
</div>
}
}
else
{
<div class="card">
<div class="card-header">
尚未创建任何角色
</div>
<div class="card-body">
<h5 class="card-title">
点击下面的按钮创建角色
</h5>
<a class="btn btn-primary" style="width:auto"
asp-controller="admin" asp-action="CreateRole">
创建角色
</a>
</div>
</div>
}
[HttpPost]
public async Task<IActionResult> DeleteRole(string id)
{
var role = await roleManager.FindByIdAsync(id); if (role == null)
{
ViewBag.ErrorMessage = $"无法找到ID为{id}的角色信息";
return View("NotFound");
}
else
{
var result = await roleManager.DeleteAsync(role); if (result.Succeeded)
{
return RedirectToAction("ListRoles");
} foreach (var error in result.Errors)
{
ModelState.AddModelError("", error.Description);
} return View("ListRoles");
}
}
[HttpGet]
public async Task<IActionResult> EditRole(string id)
{
//通过角色ID查找角色
var role = await roleManager.FindByIdAsync(id); if (role == null)
{
ViewBag.ErrorMessage = $"角色Id={id}的信息不存在,请重试。";
return View("NotFound");
} var model = new EditRoleViewModel
{
Id = role.Id,
RoleName = role.Name
}; // 查询所有的用户
foreach (var user in userManager.Users)
{
//如果用户拥有此角色,请将用户名添加到
// EditRoleViewModel模型中的Users属性中
//然后将对象传递给视图显示到客户端
if (await userManager.IsInRoleAsync(user, role.Name))
{
model.Users.Add(user.UserName);
}
} return View(model);
} //此操作方法用于响应HttpPost的请求并接收EditRoleViewModel模型数据
[HttpPost]
public async Task<IActionResult> EditRole(EditRoleViewModel model)
{
var role = await roleManager.FindByIdAsync(model.Id); if (role == null)
{
ViewBag.ErrorMessage = $"角色Id={model.Id}的信息不存在,请重试。";
return View("NotFound");
}
else
{
role.Name = model.RoleName; //使用UpdateAsync更新角色
var result = await roleManager.UpdateAsync(role); if (result.Succeeded)
{
return RedirectToAction("ListRoles");
} foreach (var error in result.Errors)
{
ModelState.AddModelError("", error.Description);
} return View(model);
}
}

  创建视图

@model EditRoleViewModel

@{
ViewBag.Title = "编辑角色";
} <h1>编辑角色</h1> <form method="post" class="mt-3">
<div class="form-group row">
<label asp-for="Id" class="col-sm-2 col-form-label"></label>
<div class="col-sm-10">
<input asp-for="Id" disabled class="form-control">
</div>
</div>
<div class="form-group row">
<label asp-for="RoleName" class="col-sm-2 col-form-label"></label>
<div class="col-sm-10">
<input asp-for="RoleName" class="form-control">
<span asp-validation-for="RoleName" class="text-danger"></span>
</div>
</div> <div asp-validation-summary="All" class="text-danger"></div> <div class="form-group row">
<div class="col-sm-10">
<button type="submit" class="btn btn-primary">更新</button>
<a asp-action="ListRoles" class="btn btn-primary">取消</a>
</div>
</div> <div class="card">
<div class="card-header">
<h3>该角色中的用户</h3>
</div>
<div class="card-body">
@if (Model.Users.Any())
{
foreach (var user in Model.Users)
{
<h5 class="card-title">@user</h5>
}
}
else
{
<h5 class="card-title">目前没有信息</h5>
}
</div>
<div class="card-footer">
<a asp-controller="Admin" asp-action="EditUsersInRole"
asp-route-roleId="@Model.Id" class="btn btn-primary">
添加或删除用户到角色中
</a>
</div>
</div>
</form>

  有了角色之后,我们需要为角色添加用户,所以先创建 EditRoleViewModel 和 UserRoleViewModel。

public class EditRoleViewModel
{
public EditRoleViewModel()
{
Users = new List<string>();
} [Display(Name = "角色Id")]
public string Id { get; set; } [Required(ErrorMessage = "角色名称是必填的")]
[Display(Name ="角色名称")]
public string RoleName { get; set; } public List<string> Users { get; set; }
}
public class UserRoleViewModel
{
public string UserId { get; set; }
public string UserName { get; set; }
public bool IsSelected { get; set; }
}
@model List<UserRoleViewModel>

@{
var roleId = ViewBag.roleId;
} <form method="post">
<div class="card">
<div class="card-header">
<h2>在此角色中添加或删除用户</h2>
</div>
<div class="card-body">
@for (int i = ; i < Model.Count; i++)
{
<div class="form-check m-1">
<input type="hidden" asp-for="@Model[i].UserId" />
<input type="hidden" asp-for="@Model[i].UserName" />
<input asp-for="@Model[i].IsSelected" class="form-check-input" />
<label class="form-check-label" asp-for="@Model[i].IsSelected">
@Model[i].UserName
</label>
</div>
}
</div>
<div class="card-footer">
<input type="submit" value="更新" class="btn btn-primary"
style="width:auto" />
<a asp-action="EditRole" asp-route-id="@roleId"
class="btn btn-primary" style="width:auto">取消</a>
</div>
</div>
</form>

  创建控制器的方法

[HttpGet]
public async Task<IActionResult> EditUsersInRole(string roleId)
{
ViewBag.roleId = roleId; var role = await roleManager.FindByIdAsync(roleId); if (role == null)
{
ViewBag.ErrorMessage = $"角色Id={roleId}的信息不存在,请重试。";
return View("NotFound");
} var model = new List<UserRoleViewModel>(); foreach (var user in userManager.Users)
{
var userRoleViewModel = new UserRoleViewModel
{
UserId = user.Id,
UserName = user.UserName
}; if (await userManager.IsInRoleAsync(user, role.Name))
{
userRoleViewModel.IsSelected = true;
}
else
{
userRoleViewModel.IsSelected = false;
} model.Add(userRoleViewModel);
} return View(model);
} [HttpPost]
public async Task<IActionResult> EditUsersInRole(List<UserRoleViewModel> model, string roleId)
{
var role = await roleManager.FindByIdAsync(roleId); if (role == null)
{
ViewBag.ErrorMessage = $"角色Id={roleId}的信息不存在,请重试。";
return View("NotFound");
} for (int i = ; i < model.Count; i++)
{
var user = await userManager.FindByIdAsync(model[i].UserId); IdentityResult result = null; if (model[i].IsSelected && !(await userManager.IsInRoleAsync(user, role.Name)))
{
result = await userManager.AddToRoleAsync(user, role.Name);
}
else if (!model[i].IsSelected && await userManager.IsInRoleAsync(user, role.Name))
{
result = await userManager.RemoveFromRoleAsync(user, role.Name);
}
else
{
continue;
} if (result.Succeeded)
{
if (i < (model.Count - ))
continue;
else
return RedirectToAction("EditRole", new { Id = roleId });
}
} return RedirectToAction("EditRole", new { Id = roleId });
}

Asp.Net Core中的角色的更多相关文章

  1. Asp.Net Core 中IdentityServer4 实战之角色授权详解

    一.前言 前几篇文章分享了IdentityServer4密码模式的基本授权及自定义授权等方式,最近由于改造一个网关服务,用到了IdentityServer4的授权,改造过程中发现比较适合基于Role角 ...

  2. ASP.NET Core中的依赖注入(3): 服务的注册与提供

    在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core ...

  3. ASP.NET Core 中的依赖注入 [共7篇]

    一.控制反转(IoC) ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了 ...

  4. ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...

  5. [译]在Asp.Net Core 中使用外部登陆(google、微博...)

    原文出自Rui Figueiredo的博文<External Login Providers in ASP.NET Core> 摘要:本文主要介绍了使用外部登陆提供程序登陆的流程,以及身份 ...

  6. asp.net Core 中AuthorizationHandler 实现自定义授权

    前言 ASP.NET Core 中 继承的是AuthorizationHandler ,而ASP.NET Framework 中继承的是AuthorizeAttribute. 它们都是用过重写里面的方 ...

  7. 【译】在Asp.Net Core 中使用外部登陆(google、微博...)

    原文出自Rui Figueiredo的博文<External Login Providers in ASP.NET Core> (本文很长) 摘要:本文主要介绍了使用外部登陆提供程序登陆的 ...

  8. ASP.NET Core 中的 WebSocket 支持(转自MSDN)

    本文介绍 ASP.NET Core 中 WebSocket 的入门方法. WebSocket (RFC 6455) 是一个协议,支持通过 TCP 连接建立持久的双向信道. 它用于从快速实时通信中获益的 ...

  9. 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获

    项目开发中的一些注意事项以及技巧总结   1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...

随机推荐

  1. zabbix数据的时序-

    gj的proxy服务器经过重启之后时序有变化. zabbix数据库中数据的存储是以哪方为准server端还是agent端, 触发事件跟恢复时间反了,本应该恢复的事件在数据库中查询event,得到的事件 ...

  2. 西门子二次开发--HMI failed to start

    一.Sinumerik二次开发错误:HMI failed to start. HMI--SL Framework reported error: GUI Component could not be ...

  3. 2017.11.7 Noip2017 考前模拟赛

    ----------------------------------T1---------------------------------- ——>数学老师的报复 题目描述 11 班数学大佬 Y ...

  4. nestjs中typeorm进行事物操作

    https://typeorm.io/#/transactions 两种方法

  5. JDBC_MySQL8.0.13_连接测试

    前言 手贱把MySQL升级到了8.0.13,在IntelliJ IDEA中测试连接不上.因此记录一下,供个人以后参考. 系统环境 win10x64 jkd11 IDEA MySQL 8.10.13 C ...

  6. 常见的HTTP方法有哪些?

    GET:请求指定的页面信息,返回实体主体: HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于捕获报头: POST:向指定资源提交数据进行处理请求(比如表单提交或者上传文件),.数据被 ...

  7. Smali语法基础

    Smali是什么 Smali是Android虚拟机的反汇编语言. 我们都知道,Android代码一般是用java编写的,执行java程序一般需要用到java虚拟机,在Android平台上也不例外,但是 ...

  8. Java for循环的语法和执行顺序

      关于java的for循环想必大家非常熟悉,它是java常用的语句之一.for循环是最灵活也是最常用的循环结构,表达式一般如下: for(表达式1;表达式2;表达式4){ 表达式3; } 执行顺序: ...

  9. FOI冬令营 Day1

    目录 T1.全连(fc) 传送门 Code  T2.原样输出(copy) 传送门 Code  T3.不同的缩写(diff) 传送门 Code  打算把省冬的题目放上来,主要是防止自己偷懒不订正 T1. ...

  10. Jenkins 获取 Git 的提交记录(Change Log)

    工作中用 Jenkins 做 iOS 和 Android 的持续集成,之前实现的是当 git 有新代码提交的时候,就会自动编译并上传安装包到蒲公英,然后自动发送QQ群通知或者讨论组通知给相关小伙伴,方 ...