代码的执行顺序是 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 实现的登陆权限控制的更多相关文章

  1. MVC中AuthorizeAttribute用法并实现权限控制

    1.创建一个类(用来检查用户是否登录和用户权限)代码如下: public class AuthorizeFilterAttribute: AuthorizeAttribute    { //Autho ...

  2. 基于Vue实现后台系统权限控制

    原文地址:http://refined-x.com/2017/08/29/基于Vue实现后台系统权限控制/,转载请注明出处. 用Vue/React这类双向绑定框架做后台系统再适合不过,后台系统相比普通 ...

  3. 利用基于@AspectJ的AOP实现权限控制

    一. AOP与@AspectJ AOP 是 Aspect Oriented Programming 的缩写,意思是面向方面的编程.我们在系统开发中可以提取出很多共性的东西作为一个 Aspect,可以理 ...

  4. ASP.MVC 基于AuthorizeAttribute权限设计案例

    ASP.MVC上实现权限控制的方法很多,比如使用AuthorizeAttribute这个特性 1.创建自定义特性用于权限验证 public class AuthorizeDiy : Authorize ...

  5. ASP.NET MVC5 Forms登陆+权限控制(控制到Action)

    一.Forms认证流程 请先参考如下网址: http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html 本文主要介绍使用自定义的身份认 ...

  6. 基于原生PHP交叉会员权限控制

    对于一个网站的后台管理系统,单一的超级管理员权限往往不能满足我们的需求,尤其是对于大型网站而言,这种单一的权限会引发许许多多的问题出现. 比如:一个网站编辑,平时他只是负责公司网站的公告更新,但如果网 ...

  7. 基于RESTful API 设计用户权限控制

    RESTful简述 本文是基于RESTful描述的,需要你对这个有初步的了解. RESTful是什么? Representational State Transfer,简称REST,是Roy Fiel ...

  8. 基于Spring AOP实现的权限控制

    1.AOP简介 AOP,面向切面编程,往往被定义为促使软件系统实现关注点的分离的技术.系统是由许多不同的组件所组成的,每一个组件负责一块特定的功能.除了实现自身核心功能之外,这些组件还经常承担着额外的 ...

  9. vue实现web登陆权限控制

    实现原理:vueRouter控制前端页面跳转路由,当登录成功后,返回用户登录token信息,将token信息放到store中,router路由跳转取store中状态有token时,当取到token时跳 ...

随机推荐

  1. jsp实现文件上传下载

    文件上传: upload.jsp <form action="uploadServlet" method="post" enctype="mul ...

  2. Webpack2学习记录-1

    1.安装前准备 安装 webpack 之前,需要安装 node,这时最新的是 6,npm 是 4.如果有老的 node 项目在跑建议安装下 nvm. 2.建议安装在局部,即在项目下的 node_mod ...

  3. luogu 1640 连续攻击游戏

    二分图匹配,将需要进行的编号(1-10000)和物件进行匹配,而非编号之间,编号对应物品 #include<bits/stdc++.h> using namespace std; ; ; ...

  4. mybatis-configxml样板

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC & ...

  5. 服务器上定时自动执行php

    两种方式: 一.Linux 服务器Linux原生支持crontab,所以可以利用这一功能做定时任务 步骤: 1.编辑crontab文件:Linux:crontab -e 2.输入代码:0 0 * * ...

  6. python 爬虫得到网页的图片

    import urllib.request,os import re # 获取html 中的内容 def getHtml(url): page=urllib.request.urlopen(url) ...

  7. Ubuntu、Windows输入命令appium-doctor提示未找到命令

    输入命令:appium-doctor时,一直报错,提示“未找到命令”,但是输入命令:appium -v能够正确输出我安装版本,这是怎么回事呢? 原来appiu-doctor在1.5.3版本之后没有了需 ...

  8. 【tmos】spring data jpa 创建方法名进行简单查询

    参考链接 spring data jpa 创建方法名进行简单查询:http://www.cnblogs.com/toSeeMyDream/p/6170790.html

  9. j假设程序需要要一个int烈血的刀变量来保存1英里所包含的步数(5280)为该变量编写一条声明语句。

    j假设程序需要要一个int烈血的刀变量来保存1英里所包含的步数(5280)为该变量编写一条声明语句. final intFT_PER_MILE =5280

  10. Spring boot+Thymeleaf+easyui集成:js创建组件页面报错

    开发工具:Ideal 使用场景:Demo 前提:       环境:Spring boot +Thymeleaf+easyui 引入thymeleaf模板引擎 <html lang=" ...