找回密码
 立即注册

QQ登录

只需一步,快速开始

断天涯大虾
社区贡献组   /  发表于:2016-7-28 14:06  /   查看:5485  /  回复:0
在上一期七天学会 ASP.NET MVC 中,小编为大家讲解了 MVC 的用户授权认证问题。
今天,来为大家讲解 MVC 的用户角色管理知识。
用户角色管理是开发中经常遇到的问题,针对管理员权限的登录与非管理员的登录需要做出不同的处理。那么在具体实现中,我们该如何操作呢?
下面,小编来为大家详细介绍。
一、非管理员用户登录时,需要隐藏 Add New 链接
1. 创建标识用户身份的枚举类型
右击 Model 文件夹,选择添加新项目。选择 “Code File” 选项。
1.jpg
输入 “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“复选框。
2.jpg
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>
<a href="/Authentication/Logout">Logout</a>
@{Html.RenderAction("GetAddNewLink");}

Html.RenderAction 执行Action 方法,并将结果直接写入响应流中。
9.运行结果
1、管理员登录
3.jpg
2、非管理员登录
4.jpg
从运行结果可以看出,在管理员登录时,左上角有 Add New 的链接,而非管理员登录时,是没有的。
二、直接 URL 安全
以上部分实现了非管理员用户无法导航到 AddNew 链接。这样还不够,如果非管理员用户直接输入 AddNew URL,则会直接跳转到此页面。
5.jpg
非管理员用户还是可以直接访问 AddNew 方法,为了解决这个问题,我们会引入 MVC action 过滤器。
Action 过滤器使得在 action 方法中添加一些预处理和后处理的逻辑判断问题。在整个实验中,会注重 ActionFilters 预处理的支持和后处理的功能。
1. 安装过滤器
新建文件夹 Filters,新建类 “AdminFilter”。
6.jpg
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. 运行结果
7.jpg
从结果可以看出,非管理员用户已经无法导航到 Add New 链接了。
以上就是实现用户角色管理的具体步骤。
后续还会更新 “七天学会 ASP.NET MVC” 的其它篇章,敬请期待。


   
关于葡萄城:全球最大的控件提供商,世界领先的企业应用定制工具、企业报表和商业智能解决方案提供商,为超过75%的全球财富500强企业提供服务。

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部