Asp.Net Core中的角色
在前面介绍中我们知道了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中的角色的更多相关文章
- Asp.Net Core 中IdentityServer4 实战之角色授权详解
一.前言 前几篇文章分享了IdentityServer4密码模式的基本授权及自定义授权等方式,最近由于改造一个网关服务,用到了IdentityServer4的授权,改造过程中发现比较适合基于Role角 ...
- ASP.NET Core中的依赖注入(3): 服务的注册与提供
在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core ...
- ASP.NET Core 中的依赖注入 [共7篇]
一.控制反转(IoC) ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了 ...
- ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)
不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...
- [译]在Asp.Net Core 中使用外部登陆(google、微博...)
原文出自Rui Figueiredo的博文<External Login Providers in ASP.NET Core> 摘要:本文主要介绍了使用外部登陆提供程序登陆的流程,以及身份 ...
- asp.net Core 中AuthorizationHandler 实现自定义授权
前言 ASP.NET Core 中 继承的是AuthorizationHandler ,而ASP.NET Framework 中继承的是AuthorizeAttribute. 它们都是用过重写里面的方 ...
- 【译】在Asp.Net Core 中使用外部登陆(google、微博...)
原文出自Rui Figueiredo的博文<External Login Providers in ASP.NET Core> (本文很长) 摘要:本文主要介绍了使用外部登陆提供程序登陆的 ...
- ASP.NET Core 中的 WebSocket 支持(转自MSDN)
本文介绍 ASP.NET Core 中 WebSocket 的入门方法. WebSocket (RFC 6455) 是一个协议,支持通过 TCP 连接建立持久的双向信道. 它用于从快速实时通信中获益的 ...
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
项目开发中的一些注意事项以及技巧总结 1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...
随机推荐
- maven下载与安装
1.下载地址:http://maven.apache.org/download.cgi(Windows平台下载*.zip压缩包,Linux平台下载*.gz压缩包) 2.解压到E:\JAVA\Maven ...
- 开源是个巨大的坑,谁来帮帮我 - smartmontools 虐我记
最近在试用smartmontools,感觉还行,于是乎想找来源码改改试试,这下可好,掉坑里了.呜呜呜... smartmontools的源码在这里可以看到:https://www.smartmonto ...
- python ros 警报上报
#!/usr/bin/env python2. # -*- coding: utf- -*- import rospy import time from common_msgs.msg import ...
- 使用Spring Ehcache二级缓存优化查询性能
最近在对系统进行优化的时候,发现有些查询查询效率比较慢,耗时比较长, 通过压测发现,主要耗费的性能 消耗在 查询数据库,查询redis 数据库:连接池有限,且单个查询不能消耗大量的连接池,占用大量IO ...
- Spring Cloud Gateway(五):路由定位器 RouteLocator
本文基于 spring cloud gateway 2.0.1 1.简介 直接 获取 路 由 的 方法 是 通过 RouteLocator 接口 获取. 同样, 该 顶 级 接口 有多 个 实现 类, ...
- ansible 任务流程控制
一.任务委托 默认情况下,ansible的所有任务都是在指定的机器上运行的,当在一个独立的群集环境中配置时,但是只想操作其中的某一台主机,或者在特定的主机上运行,此时就需要用到ansible的任务委托 ...
- synchronized的原理与使用
理论层面: 内置锁与互斥锁 修饰普通方法.修饰静态方法.修饰代码块 demo如下: package com.roocon.thread.t3; public class Sequence { priv ...
- Linux 连接memcache 拒绝连接,防火墙关闭,selinux disabled 仍然不行,最后在外站找到原因,为服务器添加memcache访问权限
最后啊,不行,直接装memcached https://www.runoob.com/memcached/memcached-install.html 附上连接:https://www.presta ...
- OpenTK学习笔记(2)-工作窗口的三种方法创建方法(winfrom窗体控件形式创建)
参考资料: https://social.msdn.microsoft.com/Forums/zh-TW/1b781685-c670-4338-953d-1957a8f24a66/opentkglco ...
- ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作。那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别是fork、source和exec。 1. fork 即通过sh 脚本名进行执行脚本的方式。下面通过一个简单的例子来讲解下它的特性。 创建father.sh,内容如下: #!/bin/bas
? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作.那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别 ...