转自:http://blog.csdn.net/kenshincui/article/details/5559508

MVC自带的ActionFilter

在Asp.Net WebForm的中要做到身份认证微软为我们提供了三种方式,其中最常用的就是我们的Form认证,需要配置相应的信息。例如下面的配置信息:

  1. <authentication mode="Forms">
  2. <forms loginUrl="Login.aspx" defaultUrl="Default.aspx" protection="All" />
  3. </authentication>
  4. <authorization>
  5. <deny users="?"/>
  6. <allow users="*"/>
  7. </authorization>

说明我们登录页面是Login.aspx,登录成功后的默认页面是Default.aspx,而我们用户信息采用验证和加密两种方式。而且最重要的 是我们要写好授权方式(下面的授权一定要写否则只说明使用Forms认证然后设置相关属性是没有用的),拒绝所有匿名用户,只有登录用户可以正常访问。这 样之后我们设置点击登录按钮将用户名写进cookie(也就是执行FormsAuthentication.SetAuthCookie(name, false);)就可以了。

在Asp.Net MVC中我们同样可以使用Forms认证,但是如果你按照WebForm中的做法去做就不行了。例如你这样配置信息:

  1. <authentication mode="Forms">
  2. <forms loginUrl="~/Account/Login" defaultUrl="~/Home/Index" protection="All"/>
  3. </authentication>
  4. <authorization>
  5. <deny users="?"/>
  6. <allow users="*"/>
  7. </authorization>

你在Login.aspx中设置登录来触发AccountController中的Logon来登录,其中Logon代码:

  1. public ActionResult Logon(string name,string password)
  2. {
  3. if (name == "jianxin160" && password == "160796")
  4. {
  5. FormsAuthentication.SetAuthCookie(name, false);
  6. return Redirect("~/Home/Index");
  7. }
  8. else
  9. {
  10. return Redirect("/");
  11. }
  12. }

这样的操作之后你会发现你的Logon是不会执行的。原因是什么呢?怎么同样的设置为什么到了MVC中就不行了?原因就是二者机制不同,因为你设置的授权方式让Logon无法访问了。那么我们怎么来做呢?

其实在Asp.Net MVC中我们有更好的方式来做这一切,我们不需要授权方式,也就是说我们的配置信息像这样:

  1. <authentication mode="Forms">
  2. <forms loginUrl="~/Account/Login" defaultUrl="~/Home/Index" protection="All"/>
  3. </authentication>

不需要说明匿名用户不能登录等。当然了,你会发现仅仅就这样做肯定不行的我们还要换一种方式告诉系统哪些是需要登录才能访问的。你或许 想,o(︶︿︶)o 唉,那太麻烦了吧。其实不是这样的,很简单,我们只需要在需要认证的Action上标记[Authorize]就可以了。例如我在Home文件夹中有两个 页面Index和Home,我现在想让Index经过认证才能访问,而Home不需要,那么只需要给Index这个Action标记 [Authorize],也就是:

  1. [Authorize]
  2. public ActionResult Index()
  3. {
  4. return View();
  5. }
  6. public ActionResult Home()
  7. {
  8. return View();
  9. }

这样Index就必须登录之后才能访问,而Home是不需要登录的。如果你需要进行角色授权那么您就可以在标记Authorize的时候指明角色 (例如[Authorize(Role=Administrators)] ),不过您这是就必须使用微软给我们提供的Membership机制了,因为您的Role不可能是平白无故有的,而是存在于对应的数据库中的,这个我在另 一篇博客中提到过就不多说了。

自定义ActionFilter

有时候这样的认证或许您还不能够满足,或者说您觉得不够灵活,那么也没有关系,Asp.Net MVC是允许您自定义ActionFilter的。例如我现在自定义身份认证:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using System.Web.Security;
  7. namespace FormFormsAuthenticationMvc
  8. {
  9. public class RequiresAuthenticationAttribute:ActionFilterAttribute
  10. {
  11. public override void  OnActionExecuting(ActionExecutingContext filterContext)
  12. {
  13. if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
  14. {
  15. string returnUrl = filterContext.HttpContext.Request.Url.AbsolutePath;
  16. string redirectUrl = string.Format("?ReturnUrl={0}", returnUrl);
  17. string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
  18. filterContext.HttpContext.Response.Redirect(loginUrl, true);
  19. }
  20. }
  21. }
  22. }

如果需要进行用户管理,我再定义角色相关的Filter:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using System.Web.Security;
  7. namespace MvcApplication1.MyClass
  8. {
  9. public class RequiresRoleAttribute:ActionFilterAttribute
  10. {
  11. public string Role { get; set; }
  12. public override void OnActionExecuting(ActionExecutingContext filterContext)
  13. {
  14. if (!string.IsNullOrEmpty(Role))
  15. {
  16. if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
  17. {
  18. string returnUrl = filterContext.HttpContext.Request.Url.AbsolutePath;
  19. string redirectUrl = string.Format("?ReturnUrl={0}", returnUrl);
  20. string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
  21. filterContext.HttpContext.Response.Redirect(loginUrl, true);
  22. }
  23. else
  24. {
  25. bool isAuthenticated = filterContext.HttpContext.User.IsInRole(Role);
  26. if (!isAuthenticated)
  27. {
  28. throw new UnauthorizedAccessException("You have no right to view the page!");
  29. }
  30. }
  31. }
  32. else
  33. {
  34. throw new InvalidOperationException("No Role Specified!");
  35. }
  36. }
  37. }
  38. }

其实您会发现上面两个Attribute其实MVC自带的Authorized已经解决了,这里主要告诉大家如果有需要您是可以扩展的。

好了,今天就到这里吧!源代码下载:FormFormsAuthenticationMvc

(转) MVC身份验证及权限管理-1的更多相关文章

  1. MVC身份验证及权限管理

    MVC自带的ActionFilter 在Asp.Net WebForm的中要做到身份认证微软为我们提供了三种方式,其中最常用的就是我们的Form认证,需要配置相应的信息.例如下面的配置信息: < ...

  2. MVC身份验证及权限管理(转载)

    from https://www.cnblogs.com/asks/p/4372783.html MVC自带的ActionFilter 在Asp.Net WebForm的中要做到身份认证微软为我们提供 ...

  3. (转) MVC身份验证及权限管理-2

    转自:http://www.cnblogs.com/ldp615/archive/2010/10/27/asp-net-mvc-forms-authentication-roles-authoriza ...

  4. mvc5+ef6+Bootstrap 项目心得--身份验证和权限管理

    1.mvc5+ef6+Bootstrap 项目心得--创立之初 2.mvc5+ef6+Bootstrap 项目心得--身份验证和权限管理 3.mvc5+ef6+Bootstrap 项目心得--WebG ...

  5. [转]mvc5+ef6+Bootstrap 项目心得--身份验证和权限管理

    本文转自:http://www.cnblogs.com/shootingstar/p/5629668.html 1.mvc5+ef6+Bootstrap 项目心得--创立之初 2.mvc5+ef6+B ...

  6. MVC自定义AuthorizeAttribute实现权限管理

    [转]MVC自定义AuthorizeAttribute实现权限管理 原文载自:小飞的DD http://www.cnblogs.com/feiDD/articles/2844447.html 网站的权 ...

  7. Asp.Net MVC 身份验证-Forms

    Asp.Net MVC 身份验证-Forms 在MVC中对于需要登录才可以访问的页面,只需要在对应的Controller或Action上添加特性[Authorize]就可以限制非登录用户访问该页面.那 ...

  8. [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)

    本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...

  9. MVC身份验证.MVC过滤器.MVC6关键字Task,Async.前端模拟表单验证,提交.自定义匿名集合.Edge导出到Excel.BootstrapTree树状菜单的全选和反选.bootstrap可搜索可多选可全选下拉框

    1.MVC身份验证. 有两种方式.一个是传统的所有控制器继承自定义Control,然后再里面用MVC的过滤器拦截.所以每次网站的后台被访问时.就会先走入拦截器.进行前端和后端的验证 一个是利用(MVC ...

随机推荐

  1. Haskell语言学习笔记(52)正则表达式

    Text.Regex.PCRE.Heavy $ brew install pcre $ cabal install pcre-heavy Installed pcre-heavy-1.0.0.2 Pr ...

  2. C++17尝鲜:类模板中的模板参数自动推导

    模板参数自动推导 在C++17之前,类模板构造器的模板参数是不能像函数模板的模板参数那样被自动推导的,比如我们无法写 std::pair a{1, "a"s}; // C++17 ...

  3. 转载 JS组件Bootstrap Select2使用方法详解

    JS组件Bootstrap Select2使用方法详解 作者:懒得安分 字体:[增加 减小] 类型:转载 时间:2016-01-26我要评论 这篇文章主要为大家介绍了JS组件Bootstrap Sel ...

  4. (4)shiro多个realm

    shiro支持多个realm,当设置多个realm的时候,shiro的认证和授权的步骤是怎样的呢. 多个realm认证原理: 发现需要在执行认证的时候,需要策略来处理多个realm存在的情况.默认实现 ...

  5. Away3D 学习笔记(一): 加载3DS格式的模型文件

    加载外部的3DS文件分为两种: 1: 模型与贴图独立于程序的,也就是从外部的文件夹中读取 private function load3DSFile():Loader3D { loader = new ...

  6. MIUI添加内存调试工具:查看进程中的Bitmap信息

    Android开发中的内存管理一直是令人头痛的事情.其中占用内存最大的一般是Bitmap.   在上周五发布的MIUI开发版中,我添加了查看内存里Bitmap信息的功能.大家开发app的时候可以使用这 ...

  7. GEOquery

    1)介绍 来自NCBI的Gene Expression Omnibus(GEO)作为各种高通量实验数据的公共存储库. 这些数据包括基于单通道和双通道微阵列的实验,测量mRNA,基因组DNA和蛋白质丰度 ...

  8. 把Excel导入SQL server时出现错误

    在把Excel导入SQL server时出现“未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0 ”该 错误信息:未在本地计算机上注册“microsoft.ACE.oledb.12 ...

  9. hdoj1176 免费馅饼(dp 数塔)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176 思路: 这道题不复杂,很明显是个dp题,数据比较大,搜索应该会超时,想到如何初始化,注意细节就差 ...

  10. Drying

    Drying http://poj.org/problem?id=3104 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 2 ...