MVC自定义AuthorizeAttribute实现权限管理
【转】MVC自定义AuthorizeAttribute实现权限管理
原文载自:小飞的DD http://www.cnblogs.com/feiDD/articles/2844447.html
网站的权限管理是一个很重要的功能,MVC中怎么实现对于网站的权限管理呢。
在MVC中有一个名为AuthorizeAttribute的类,我们可以创建我们自己的特性 MemberValidationAttribute类,然后继承AuthorizeAttribute类来实现我们自己的网站权限的管理。然后通过将 MemberValidation特性添加到具体的Action上,将我们的权限管理精确到某个页面上。
下面我通过一个例子了解一下。
首先我们创建一个空的MVC项目。创建两个Controller和三个页面。
主页Controller

public class HomeController : Controller
{
//
// GET: /Home/ public ActionResult Index()
{
return View();
} }

页面
用户登录Controller,在Login Action下添加 Cookie写入代码。

public class MemberController : Controller
{
//
// GET: /Member/
public ActionResult Index()
{
return View();
}
public ActionResult Login()
{
var cookie = new HttpCookie("Login", "Success");
System.Web.HttpContext.Current.Response.SetCookie(cookie);
return View("LoginSuccess");
}
}

页面
以上三个截图的关系是,我们希望用户先是通过登录页面登录,提示成功后,在进入Home页面。但是这时我们通过在地址栏内输 入"/Home"也可以登录到主页面,那也许就会报错。在我做的上个项目中,就是需要对用户的批量下单做一个验证,如果有没通过验证的订单是不让用户通过 在地址栏输入地址跳转到订单结算页面的,不然是会报错的。这里就需要我们将针对某一页面的验证添加到相应的Action上去。
下面我们添加一个名为MemberValidationAttribute类,让他继承AuthorizeAttribute类,这里我们只需要实现他的OnAuthorization方法

public class MemberValidationAttribute:AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//获取Cookies中的Login
var memberValidation = System.Web.HttpContext.Current.Request.Cookies.Get("Login");
//如果memberValidation为null 或者 memberValidation不等于Success
if (memberValidation==null||memberValidation.Value != "Success")
{
//页面跳转到 登录页面
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {controller="Member",action="Index" }));
return;
}
//通过验证
return;
}
}

然后将特性添加到HomeController下的Index Action上。

public class HomeController : Controller
{
[MemberValidation]
public ActionResult Index()
{
return View();
}
}

这下再怎么通过Url去跳转的话也不能再不通过登录的情况下进入我们的Home Index 页面了。
有两个遗留问题要在这里说一下:
第一:登录成功的页面并没有添加一个跳转到Home Index的 按钮,所以登录成功后还是要通过Url 到Home Index去。
第二:用户登录的时候将Cookie Login 清空。
2013-5-22 遗留问题一
在AuthorizeAttribute中还有一个方法叫AuthorizeCore,他返回一个bool值表示是否通过验证。通过验证的话跳转到下一页面A,如果未通过验证,则跳转到登录页面。

protected override bool AuthorizeCore(HttpContextBase httpContext)
{ var cook = System.Web.HttpContext.Current.Request.Cookies.Get("CustomerInfo"); if (cook != null)
{
if (cook.ToString() != "")
{
return true;
} }
return false;
}

登录页面的设置在web.config中。如下:
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Account/LoginPage" timeout="2880" />
</authentication>
</system.web>
loginUrl就是要跳转到的登录页面,这是在url地址栏会携带A的地址,作为登录成功后的跳转。

public ActionResult LoginPage(string ReturnUrl)
{
if (ReturnUrl != null)
ViewBag.ReturnUrl = ReturnUrl;
return View();
}

MVC自定义AuthorizeAttribute实现权限管理的更多相关文章
- MVC 自定义AuthorizeAttribute实现权限管理
在上一节中提到可以使用AuthorizeAttribute进行权限管理: [Authorize] public ActionResult TestAuthorize() { return View() ...
- C#_MVC 自定义AuthorizeAttribute实现权限管理
随笔- 28 文章- 31 评论- 16 MVC 自定义AuthorizeAttribute实现权限管理 在上一节中提到可以使用AuthorizeAttribute进行权限管理: [Autho ...
- MVC 自定义AuthorizeAttribute 实现权限验证
MVC内置的AuthorizeFilter先于Action/Result过滤器执行,为网站权限验证提供了很好的一套验证机制. 通过自定义的AuthorizeAttribute可以实现对用户权限的验证. ...
- [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)
本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...
- MVC身份验证及权限管理
MVC自带的ActionFilter 在Asp.Net WebForm的中要做到身份认证微软为我们提供了三种方式,其中最常用的就是我们的Form认证,需要配置相应的信息.例如下面的配置信息: < ...
- MVC身份验证及权限管理(转载)
from https://www.cnblogs.com/asks/p/4372783.html MVC自带的ActionFilter 在Asp.Net WebForm的中要做到身份认证微软为我们提供 ...
- (转) MVC身份验证及权限管理-2
转自:http://www.cnblogs.com/ldp615/archive/2010/10/27/asp-net-mvc-forms-authentication-roles-authoriza ...
- SQLSERVER 数据库性能的的基本 MVC + EF + Bootstrap 2 权限管理
SQLSERVER 数据库性能的基本 很久没有写文章了,在系统正式上线之前,DBA一般都要测试一下服务器的性能 比如你有很多的服务器,有些做web服务器,有些做缓存服务器,有些做文件服务器,有些做数据 ...
- SharePoint _layouts下自定义程序页面权限管理
在sharepoint中,_layouts下的自定义页面没有特别的权限,只要用户能访问sharepoint站点就可以访问_layouts下的自定义程序页面,现在我们需要给自定义页面做一下权限认证.要求 ...
随机推荐
- UVA1471( LIS变形)
这是LIS的变形,题意是求一个序列中去掉某个连续的序列后,能得到的最长连续递增序列的长度. 用DP的解法是:吧这个序列用数组a来记录,再分别用两个数组f记录以i结尾的最长连续递增序列的长度,g[i]记 ...
- C++ 字符串分割,分割到vector中
#include <string> #include <vector> using std::string; using std::vector; int splitStrin ...
- ThinkPHP第二十天(getField用法、常用管理员表结构、树形结构前小图标CSS)
1.getField($fields,$sepa=null) A:当$fields为1个字段,$sepa=null的时候,返回一个符合条件的记录的字段. B:如果要取得所有符合条件记录字段,需要$se ...
- .net 基础错误-string.replace 方法
1.string string.Replace(string oldValue,string newValue) 返回一个新的字符串,其中当前示例中出现的所有指定字符串都替换另一个指定字符串 错误:总 ...
- 哈希长度扩展攻击的简介以及HashPump安装使用方法
哈希长度扩展攻击(hash length extension attacks)是指针对某些允许包含额外信息的加密散列函数的攻击手段.该攻击适用于在消息与密钥的长度已知的情形下,所有采取了 H(密钥 ∥ ...
- leetcode_question_67 Add Binary
Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...
- Ext JS学习第三天 我们所熟悉的javascript(二)
•javascript之函数 •对于Ext开发者,我还是希望你能对javascript原生的东西非常了解.甚至熟练掌握运用.那么函数,无疑是非常重要的概念.首先在前面一讲,我们知道了函数也是一种数据类 ...
- Enze fourth day(循环语句 一)
哈喽,大家好.又到了总结知识的时间了.今天在云和学院自学了一下循环语句,下面是自己总的一些知识点. 先补充一下选择结构中的switch语句. 理论:switch语句是一种多分支选择语句,当需要测试大量 ...
- ansible笔记
ansible 资料 ansible 配置 ansible inventory配置文件 ansible模块 http://www.cnblogs.com/iois/p/6216936.html ans ...
- MySQL 5.6.x 配置数据库主从复制
[转]http://blog.csdn.net/lwprain/article/details/10966837 备注: 在配置之前如果之前配置过主从没成功的话, 最好把master数据库目录下的my ...