MVC 基于 AuthorizeAttribute 实现的登陆权限控制
代码的执行顺序是 OnAuthorization–>AuthorizeCore–>HandleUnauthorizedRequest. 如果AuthorizeCore返回false时,才会走HandleUnauthorizedRequest 方法,并且Request.StausCode会返回401。
首先创建一个MCV的项目,在App_Start目录下创建一个类UserAuthAttribute,此类要继承AuthorizeAttribute类,这里继承的时候注意using System.Web.Mvc;
接着在App_Start目录下找到 FilterConfig类,添加注册。
登陆页面:
<!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>LogIn</title>
</head>
<body>
<div style=" width:600px; margin:50px auto;">
<form action="/Account/LogIn" method="post">
<table>
<tr><td>User Name</td><td><input type="text" id="username" name="username" /></td></tr>
<tr><td>Pass word</td><td><input type="password" id="password" name="password" /></td></tr>
<tr><td></td><td><input type="submit" value="LogIn" /></td></tr>
</table>
</form>
</div>
</body>
</html>
登陆后台
[AllowAnonymous]
public ActionResult LogIn()
{
string User_Name = this.Request.Form["username"];
string User_Pw = this.Request.Form["password"];
if (!string.IsNullOrEmpty(User_Name) && !string.IsNullOrEmpty(User_Pw))
{
List<User> Ulist = TestData.Users;
var userinfos = Ulist.Where(e => e.UserName.Equals(User_Name) && e.PassWord.Equals(User_Pw));
if (userinfos != null && userinfos.Count() == )
{
User _user = userinfos.FirstOrDefault();
Session[WebConstants.UserSession] = _user;
Session[WebConstants.UserRoleMenu] = TestData.GetMenuByUserID(_user.UserID);
string fromurl = Request.UrlReferrer.Query;
if (fromurl.IndexOf("?fromurl=") > -)
{
fromurl = fromurl.Substring(); return this.Redirect(fromurl);
}
else
{
return this.RedirectToAction("Home", "Account");
} }
} return View();
}
注意:LogIn()加了标识 [AllowAnonymous] ,表示允许任何用户访问.
登陆完成后,session记录用户信息和可访问的Menu信息,跳转到主页或者先前页。
最重要的一个环节就是之前创建的UserAuthAttribute这个类:
在类里先定义个变量
public bool IsLogin = false;
验证是否已经登陆,判定是否有权限
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool Pass = false;
try
{
var websession = httpContext.Session[WebConstants.UserSession];
if (websession == null)
{
httpContext.Response.StatusCode = ;//无权限状态码
Pass = false;
IsLogin = false;
}
else
{
User user = httpContext.Session[WebConstants.UserSession] as User;
if (user == null)
{
httpContext.Response.StatusCode = ;//无权限状态码
Pass = false;
IsLogin = false;
}
else if (!IsMenuRole(httpContext))
{
httpContext.Response.StatusCode = ;//无权限状态码
Pass = false;
IsLogin = true;
}
else
{
Pass = true;
}
}
}
catch (Exception)
{
return Pass;
}
return Pass;
}
当上面这个方法返回false时才会执行下面这个方法, 进行跳转, 若没登陆,跳转到登陆页并带有参数,当登陆完成后可以跳转的先前页。这URL可以使用加密,防止客户修改或传递的参数发生编码错误。
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
else
{
if (!IsLogin)
{
string fromUrl = filterContext.HttpContext.Request.Url.PathAndQuery;
// string strUrl = new UrlHelper(filterContext.RequestContext).Action("Login", "Account","") + "?fromurl={0}";
string strUrl = "~/Account/Login/?fromurl={0}";
//filterContext.HttpContext.Response.Redirect(string.Format(strUrl, fromUrl), true);
filterContext.Result = new RedirectResult(string.Format(strUrl, fromUrl));
}
else
{
filterContext.Result = new RedirectResult("~/Account/NoPremission");
} }
}
MVC 基于 AuthorizeAttribute 实现的登陆权限控制的更多相关文章
- MVC中AuthorizeAttribute用法并实现权限控制
1.创建一个类(用来检查用户是否登录和用户权限)代码如下: public class AuthorizeFilterAttribute: AuthorizeAttribute { //Autho ...
- 基于Vue实现后台系统权限控制
原文地址:http://refined-x.com/2017/08/29/基于Vue实现后台系统权限控制/,转载请注明出处. 用Vue/React这类双向绑定框架做后台系统再适合不过,后台系统相比普通 ...
- 利用基于@AspectJ的AOP实现权限控制
一. AOP与@AspectJ AOP 是 Aspect Oriented Programming 的缩写,意思是面向方面的编程.我们在系统开发中可以提取出很多共性的东西作为一个 Aspect,可以理 ...
- ASP.MVC 基于AuthorizeAttribute权限设计案例
ASP.MVC上实现权限控制的方法很多,比如使用AuthorizeAttribute这个特性 1.创建自定义特性用于权限验证 public class AuthorizeDiy : Authorize ...
- ASP.NET MVC5 Forms登陆+权限控制(控制到Action)
一.Forms认证流程 请先参考如下网址: http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html 本文主要介绍使用自定义的身份认 ...
- 基于原生PHP交叉会员权限控制
对于一个网站的后台管理系统,单一的超级管理员权限往往不能满足我们的需求,尤其是对于大型网站而言,这种单一的权限会引发许许多多的问题出现. 比如:一个网站编辑,平时他只是负责公司网站的公告更新,但如果网 ...
- 基于RESTful API 设计用户权限控制
RESTful简述 本文是基于RESTful描述的,需要你对这个有初步的了解. RESTful是什么? Representational State Transfer,简称REST,是Roy Fiel ...
- 基于Spring AOP实现的权限控制
1.AOP简介 AOP,面向切面编程,往往被定义为促使软件系统实现关注点的分离的技术.系统是由许多不同的组件所组成的,每一个组件负责一块特定的功能.除了实现自身核心功能之外,这些组件还经常承担着额外的 ...
- vue实现web登陆权限控制
实现原理:vueRouter控制前端页面跳转路由,当登录成功后,返回用户登录token信息,将token信息放到store中,router路由跳转取store中状态有token时,当取到token时跳 ...
随机推荐
- Javaweb学习笔记——(十)——————response对象,response字符流缓冲器,响应头,状态码,重定向,requset对象,路径和乱码
请求响应对象: request和response *当服务器接收都请求后,服务器会创建request和response对象,把请求数据封装到request对象中: *然后调用Servlet的sevic ...
- 001_twoSum
#####solution01##### # def twoSum(nums, target): # res=[] # for i in range(0,len(nums)-1): # p1 = nu ...
- select样式设计
举例: select { color: blue; /*去掉边框*/ border: none; outline: none; /*去掉箭头*/ -webkit-appearance: none; / ...
- Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)
题目链接 A. Make a triangle! 题意 让某段最少增加多少使得构成三角形 思路 让较小两段往最长段去凑 代码 #include <bits/stdc++.h> #defin ...
- Flask三种导入配置文件的方式
# 配置对象,里面定义需要给 APP 添加的一系列配置 class Config(object): DEBUG = True # 从配置对象中加载配置 app.config.from_object(C ...
- 反射中的一个问题点:利用Method执行main方法特殊的地方
利用Method执行main方法 问题: 启动Java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射方式来调用这个m ...
- 【Math for ML】矩阵分解(Matrix Decompositions) (上)
I. 行列式(Determinants)和迹(Trace) 1. 行列式(Determinants) 为避免和绝对值符号混淆,本文一般使用\(det(A)\)来表示矩阵\(A\)的行列式.另外这里的\ ...
- 为什么可逆矩阵又叫“非奇异矩阵(non-singular matrix)”?
最近在捡回之前的线性代数知识,在复习可逆矩阵的时候,发现有的书上把可逆矩阵又称为非奇异矩阵,乍一看名字完全不知所云,仔细一分析,还是不明白.要想弄明白,还是得从英文入手,下面的解释主要从这里得来的Wh ...
- CentOS 7 安装配置 MySQL
https://blog.imzhengfei.com/centos-7-an-zhuang-pei-zhi-mysql/ MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前 ...
- 20165231 2017-2018-2《Java程序设计》课程总结
每周作业链接汇总 预备作业一:我期待的师生关系 预备作业二:学习基础和C语言基础调查 预备作业三:linux安装及学习 第一周作业:初识JAVA,注册码云并配置Git 第二周作业:JAVA基本语法,标 ...