ASP.MVC 基于AuthorizeAttribute权限设计案例
时间:2022-04-22
本文章向大家介绍ASP.MVC 基于AuthorizeAttribute权限设计案例,主要内容包括1.创建自定义特性用于权限验证、2.创建控制器基类便于其他控制器继承、3.登录控制器的写法、4.其他页面的Demo、5.效果、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
ASP.MVC上实现权限控制的方法很多,比如使用AuthorizeAttribute这个特性
1.创建自定义特性用于权限验证
public class AuthorizeDiy : AuthorizeAttribute
{
/// <summary>
/// 提供一个入口用于自定义授权检查
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool pass = false;
HttpCookie cookie = HttpContext.Current.Request.Cookies["admin"];
if (cookie == null || cookie.Value == null)
{
httpContext.Response.StatusCode = 401;
pass = false;
}
else
{
pass = true;
}
return pass;
}
/// <summary>
/// 处理未能授权的Http请求
/// </summary>
/// <param name="filterContext"></param>
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
filterContext.HttpContext.Response.Write(filterContext.HttpContext.Response.StatusCode);
if (filterContext.HttpContext.Response.StatusCode == 401)
{
//跳转到登录界面
filterContext.Result = new RedirectResult("/Login");
}
}
}
重写2个方法用于验证处理授权请求和授权失败。
2.创建控制器基类便于其他控制器继承
[AuthorizeDiy]
public class BaseAdminController:Controller
{
}
注意使用自定义特性
3.登录控制器的写法
/// <summary>
/// 登录控制器
/// </summary>
public class LoginController : BaseAdminController
{
//
// GET: /Login/
[AllowAnonymous]
public ActionResult Index()
{
return View();
}
[HttpPost]
[AllowAnonymous]
public JsonResult LoginCheck()
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1,
"admin",
DateTime.Now,
DateTime.Now.AddDays(1),
true,
Newtonsoft.Json.JsonConvert.SerializeObject(new {name="test"}));
string ticString = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie("admin", ticString);
Response.Cookies.Add(cookie);
object result = new { success = true };
return this.Json(result);
}
}
注意:继承基类,并且使用MVC自定义特性进行授权此处只是简单实现。注意:跳转登录和验证登录的2个action必须使用Allowanonymous特性否则登录界面的权限验证无法通过会出现重复定向多次的错误
4.其他页面的Demo
登录视图:
@{
ViewBag.Title = "Index";
}
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<h2>这个是登录界面</h2>
<form class="formClass">
<button>登录</button>
</form>
<script>
$(function ()
{
$(".formClass").submit(function ()
{
$.post("/Login/LoginCheck", {}, function (r) {
alert(JSON.stringify(r));
if (r) {
location.href = "/Home/Index";
}
else {
alert("登录失败");
}
});
return false;
})
})
</script>
主视图:
@{
ViewBag.Title = "Index";
}
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<h2>Index</h2>
<script>
$(function ()
{
})
</script>
主页控制器:
public class HomeController : BaseAdminController
{
//
// GET: /Home/
public ActionResult Index()
{
return View();
}
}
5.效果
先正常操作,然后清空缓存,实现权限控制效果,MVC路由指向Home控制器的Index
当进入主页时发现未授权自动跳转至登录界面
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python第七十课——python2与python3的一些区别
- Linux运维必会的100道MySql面试题之(一)
- Linux运维必会的100道MySql面试题之(二)
- Apache服务的反向代理及负载均衡配置
- Linux系统集群架构线上项目配置实战(二)
- Linux系统集群架构线上项目配置实战(三)
- Linux系统集群架构线上项目配置实战(四)
- Linux系统集群架构线上项目配置实战 五(完结篇)
- 生产Mysql数据库数据恢复实战过程
- voliate工作实际应用场景
- Linux三剑客命令之Awk
- 面试2万月薪必会知识:AQS
- MyBatis XML详解
- Linux三剑客命令之Sed
- Linux运维必会的100道MySql面试题之(四)