七天学会ASP.NET MVC (5) -- 用户角色管理
haoteby 2025-10-08 17:07 10 浏览
在上一期七天学会 ASP.NET MVC 中,小编为大家讲解了 MVC 的用户授权认证问题。
今天,来为大家讲解 MVC 的用户角色管理知识。
用户角色管理是开发中经常遇到的问题,针对管理员权限的登录与非管理员的登录需要做出不同的处理。那么在具体实现中,我们该如何操作呢?
下面,小编来为大家详细介绍。
一、非管理员用户登录时,需要隐藏 Add New 链接
1. 创建标识用户身份的枚举类型
右击 Model 文件夹,选择添加新项目。选择 “Code File” 选项。
输入 “UserStatus” 名,点击添加。
“Code File” 选项会创建一个 “.cs” 文件.
创 UserStatus 枚举类型,如下:
namespace WebApplication1.Models
{
public enum UserStatus
{
AuthenticatedAdmin,
AuthentucatedUser,
NonAuthenticatedUser
}
}
2. 修改业务层功能
删除 IsValidUser 函数,创建新函数 “GetUserValidity“,如下:
public UserStatus GetUserValidity(UserDetails u)
{
if (u.UserName == "Admin" && u.Password == "Admin")
{
return UserStatus.AuthenticatedAdmin;
}
else if (u.UserName == "Sukesh" && u.Password == "Sukesh")
{
return UserStatus.AuthentucatedUser;
}
else
{
return UserStatus.NonAuthenticatedUser;
}
}
3. 修改 DoLogin action 方法
打开 AuthenticationController, 修改 DoLogin action:
[HttpPost]
public ActionResult DoLogin(UserDetails u)
{
if (ModelState.IsValid)
{
EmployeeBusinessLayer bal = new EmployeeBusinessLayer();
//New Code Start
UserStatus status = bal.GetUserValidity(u);
bool IsAdmin = false;
if (status==UserStatus.AuthenticatedAdmin)
{
IsAdmin = true;
}
else if (status == UserStatus.AuthentucatedUser)
{
IsAdmin = false;
}
else
{
ModelState.AddModelError("CredentialError", "Invalid Username or Password");
return View("Login");
}
FormsAuthentication.SetAuthCookie(u.UserName, false);
Session["IsAdmin"] = IsAdmin;
return RedirectToAction("Index", "Employee");
//New Code End
}
else
{
return View("Login");
}
}
在上述代码中,已经出现 Session 变量来识别用户身份。
什么是 Session?
Session 是 Asp.Net 的特性之一,可以在 MVC 中重用,可用于暂存用户相关数据,session 变量周期是穿插于整个用户生命周期的。
4. 移除存在的 AddNew 链接
打开 “~/Views/Employee” 文件夹下 Index.cshtml View,移除 “Add New” 超链接。
<a href="/Employee/AddNew">Add New</a>
5. 创建分部 View
右击“~/Views/Employee”文件夹,选择添加View,设置View名称”“AddNewLink”“,选中”Create a partial View“复选框。
6. 输入分部 View 的内容
在新创建的分部视图中输入以下内容:
<a href="/Employee/AddNew">Add New</a>
7. 新建 Action 方法
打开 EmployeeController,新建Action 方法”GetAddNewLink“,如下:
public ActionResult GetAddNewLink()
{
if (Convert.ToBoolean(Session["IsAdmin"]))
{
return Partial View("AddNewLink");
}
else
{
return new EmptyResult();
}
}
8. 显示 AddNew 链接
打开 Index.html,输入以下代码:
<a href="/Authentication/Logout">Logout</a>
</div>
<hr />
@{
Html.RenderAction("GetAddNewLink");
}
<div>
<table border="1">
<tr>
Html.RenderAction 执行Action 方法,并将结果直接写入响应流中。
9.运行结果
1、管理员登录
2、非管理员登录
从运行结果可以看出,在管理员登录时,左上角有 Add New 的链接,而非管理员登录时,是没有的。
二、直接 URL 安全
以上部分实现了非管理员用户无法导航到 AddNew 链接。这样还不够,如果非管理员用户直接输入 AddNew URL,则会直接跳转到此页面。
非管理员用户还是可以直接访问 AddNew 方法,为了解决这个问题,我们会引入 MVC action 过滤器。
Action 过滤器使得在 action 方法中添加一些预处理和后处理的逻辑判断问题。在整个实验中,会注重 ActionFilters 预处理的支持和后处理的功能。
1. 安装过滤器
新建文件夹 Filters,新建类 “AdminFilter”。
2. 创建过滤器
通过继承 ActionFilterAttribute ,将 AdminFilter 类升级为”ActionFilter“,如下:
public class AdminFilter:ActionFilterAttribute
{
}
注意:要使用 ActionFilterAttribute 你在上面使用 System.Web.Mvc放。
第3步 - 添加安全验证逻辑
在 ActionFliter 中重写 OnActionExecuting 方法:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!Convert.ToBoolean(filterContext.HttpContext.Session["IsAdmin"]))
{
filterContext.Result = new ContentResult()
{
Content="Unauthorized to access specified resource."
};
}
}
4. 绑定过滤器
在 AddNew 和 SaveEmployee 方法中绑定过滤器,如下:
[AdminFilter]
public ActionResult AddNew()
{
return View("CreateEmployee",new Employee());
}
...
...
[AdminFilter]
public ActionResult SaveEmployee(Employee e, string BtnSubmit)
{
switch (BtnSubmit)
{
case "Save Employee":
if (ModelState.IsValid)
{
EmployeeBusinessLayer empBal = new EmployeeBusinessLayer();
....
....
5. 运行结果
从结果可以看出,非管理员用户已经无法导航到 Add New 链接了。
以上就是实现用户角色管理的具体步骤。
后续还会更新 “七天学会 ASP.NET MVC” 的其它篇章,敬请期待。
相关开发工具
在进行 ASP.NET MVC 的开发时,还可以借助一些开发工具,在提高工作效率的同时,还可以减少工作量。 使用 ComponentOne Studio Enterprise 中提供的 ComponentOne Studio ASP.NET MVC,能够获取快速的轻量级控件来满足用户所有需求。
快人一步,免费试用
如果您想试用 ComponentOne Studio ASP.NET MVC,请联系我们:
微信:GrapeCityDT
邮件:marketing.xa@grapecity.com
官网:www.gcpowertools.com.cn
关于葡萄城控件
葡萄城是一家跨国软件研发集团,专注控件领域近30年,是全球最大的控件提供商,也是微软认证的金牌合作伙伴
往期七天学会ASP.NET MVC
相关推荐
- 如何为MySQL服务器和客户机启用SSL?
-
用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...
- k8s 证书问题排查_k8s dashboard 证书
-
从去年开始一些老项目上陆陆续续出现一些列的证书问题,(证书原理这里就不说了,官方文档一堆)多数刚开始的表现就是节点的kubelet服务起不来,节点状态NotReady表现日志如下failed...
- 企业级网络互通方案:云端OpenVPN+爱快路由器+Win11互联实战
-
企业级网络互通方案:OpenVPN搭建公有云+爱快路由器+Win11三地互联实战指南「安全高效」三地局域网秒变局域网实施环境说明...
- OpenV** Server/Client配置文件详解
-
Server配置详解...
- 接口基础认知:关键信息与合规前提
-
1.核心技术参数(必记)...
- S交换机通过SSH登录设备配置示例(RADIUS认证+本地认证独立)
-
说明:●本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。●通过不同的管理域来实现RADIUS认证与本地认证两种方式同时使用,两...
- SSL证书如何去除私钥密码保护_ssl证书怎么取消
-
有时候我们在生成证书的时候可以加入了密码保护。然后申请到证书安装到了web服务器。但是这样可能会带来麻烦。每次重启apache或者nginx的时候,都需要输入密码。那么SSL证书如何去除私钥密码保护。...
- SSL证书基础知识与自签名证书生成指南
-
一、证书文件类型解析...
- S交换机通过SSH登录设备配置示例(RADIUS认证)
-
说明:本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。假设已在RADIUS服务器上创建了用户名yc123,密码test#123。对...
- HTTPS是什么?加密原理和证书。SSL/TLS握手过程
-
秘钥的产生过程非对称加密...
- HTTPS TLS握手流程_进行tls握手
-
1.客户端向服务器发送`ClientHello`消息,包括支持的TLS版本、加密套件、随机数等信息。2.服务器收到`ClientHello`消息后,解析其中的信息,并根据配置选择一个加密套件。3....
- Spring Boot 单点登录(SSO)实现_spring boot 单点登录jwt
-
SpringBoot单点登录(SSO)实现全指南单点登录(SingleSign-On,SSO)是一种身份验证机制,允许用户使用一组凭证登录多个相关但独立的系统。在微服务架构和企业级系统中,SS...
- 源码分享:在pdf上加盖电子签章_pdf如何加盖电子公章
-
在pdf上加盖电子签章,并不是只是加个印章图片,。而是要使用一对密钥中的私钥对文件进行签字。为啥要用私钥呢?很简单,因为公钥是公开的,其他人才可以用公钥为你证明,这个文件是你签的。这就是我们常说的:私...
- 微信支付商户API证书到期 怎么更换
-
微信支付商户API证书到期更换是一个非常重要的操作,需要仔细按照流程进行。如果证书过期,所有通过API的支付、退款等操作都会失败,将直接影响您的业务。请按照以下详细步骤进行操作:重要前提:分清...