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下的自定义程序页面,现在我们需要给自定义页面做一下权限认证.要求 ...
随机推荐
- BZOJ 2821: 作诗(Poetize)( 分块 )
分块,分成N^0.5块.O(N^1.5)预处理出sm[i][j]表示前i块中j的出现次数, ans[i][j]表示第i~j块的答案. 然后就可以O(N^0.5)回答询问了.总复杂度O((N+Q)N^0 ...
- servlet三种实现方式之二继承GenericServlet开发
servlet有三种实现方式: 1.实现servlet接口 2.继承GenericServlet 3.通过继承HttpServlet开发servlet 第二种示例代码如下(已去掉包名): //这是第二 ...
- PHP发送短信如何实现?
最近要用php发送和接收短信,用户订单要用短信通知一类的功能,网上看了好多短信平台感觉都不靠谱. 也测试了很多代码,下面把几款PHP发送短信好用的分享给大家: PHP发送短信方法一(比较好,推荐) / ...
- java 无法割符日期字符串转yyyy-MM-dd hh:mm:ss
1.需要转换字符串(20150210125942),转化后要达到的目的:2015-02-10 12:59:42 public static void main(String[] args) { Str ...
- Android 开发笔记“Application 理解”
Android 中Application类用法 1. Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时 ...
- cdoj 1134 男神的约会 状压dp
题目链接 给一个10*10的方格, 每个格子里面有0-9,走到一个格子, 就要在这个格子待一段时间, 时间长度为这个格子的数字. 从左上角走到右下角, 要求0-9必须每种格子都要走到, 输出最短时间. ...
- <转> Python的优雅技巧
枚举 不要这么做: 全选复制放进笔记 i = 0 for item in iterable: print i, item i += 1 而是这样: 全选复制放进笔记 for i, item in en ...
- 安装VMware vSphere 的目的就是在一台物理服务器上安装很多很多的虚拟机
版权声明:本文为博主原创文章,未经博主允许不得转载. 我们安装VMware vSphere 的目的就是在一台物理服务器上安装很多很多的虚拟机,我们可以通过VMware vSphere Client直接 ...
- live555 RTSP服务器建立及消息处理流程
DynamicRTSPServer::creatnew(): 1.调用继承自RTPSever::setUpOurSocket: 1.调用 GroupsockHelper 的 set ...
- [转载]Android 知识图谱
from: http://blog.csdn.net/xyz_lmn/article/details/41411355