当我们使用Asp.net MVC Forms方式验证用户, 然后设置Controller 或 Action 的 Authorize属性时, 默认情况下只有Users属性可以设置(这里的Users通常是指用户登录名), 我们无法直接设置用户的角色信息 , 当建立一个依赖角色的应用时(又不想麻烦配置Membership),我们有必要给认证用户加上角色信息,下面是具体方法 :

1.Web.config 配置 ,以下设置标明我们使用Forms验证

    <authentication mode="Forms">
<forms loginUrl="~/Account/LogIn" timeout="" slidingExpiration="true" cookieless="UseCookies" path="/" name=".MYASPXAUTH" />
</authentication>
<!--<authorization>
<deny users="?"/>
</authorization>-->

具体配置参考:http://msdn.microsoft.com/zh-cn/library/1d3t3c61(v=vs.100).aspx

<forms
name="name"
loginUrl="URL"
defaultUrl="URL"
protection="[All|None|Encryption|Validation]"
timeout="[MM]"
path="path"
requireSSL="[true|false]"
slidingExpiration="[true|false]">
enableCrossAppRedirects="[true|false]"
cookieless="[UseUri|UseCookies|AutoDetect|UseDeviceProfile]"
domain="domain name"
ticketCompatibilityMode="[Framework20|Framework40]">
<credentials>...</credentials>
</forms>

slidingExpiration:是否滑动过期,应设置为true    
    name属性:如果服务器有多个应用程序,每个应用程序的name属性应不同。
    上面代码注释掉了deny 设置,如果设置了上面的项,则所有页面都需要用户登录。注释掉之后,只在访问在Controller或Action上面设置了验证用户或角色的页面时,才提示登录。
2 Global.asax.cs 添加验证请求事件代码 ,如果用户信息已经设置, 则重新构造带角色信息的用户对象 , 角色信息从身份凭证票据的UserData属性中获取,多个角色以逗号隔开。

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
var app = sender as HttpApplication; if (app.Context.User != null)
{
var user = app.Context.User;
var identity = user.Identity as FormsIdentity; // We could explicitly construct an Principal object with roles info using System.Security.Principal.GenericPrincipal
var principalWithRoles = new GenericPrincipal(identity, identity.Ticket.UserData.Split(',')); // Replace the user object
app.Context.User = principalWithRoles;
}
}

上面代码是Asp.net请求管道中的一个环节,每次请求时都会执行。
    如果UserData中还想保存其它数据,需要使用其它分隔符进行分割并处理。
    这种方式主要用于系统功能简单,角色较少的应用。
经过上面角色的转换,系统就可以直接使用内部定义的验证方式进行验证了。

3.用户合法性验证通过后, 构造带角色信息的加密身份凭据 , 角色信息存储在票据的UserData中。

[HttpPost]
public ActionResult LogOn(User user)
{
// check user by quering database or other ways. skip this logic. string userRoles = "admin,user,powerUser";
bool isPersistent = false;
int version = ;
double persistentMinutes = 30.00; // minutes
string userName = user.Name; string cookiePath = FormsAuthentication.FormsCookiePath; FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(version, userName, DateTime.Now, DateTime.Now.AddMinutes(persistentMinutes), isPersistent, userRoles, cookiePath);
string encryptedTicket = FormsAuthentication.Encrypt(ticket); HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(cookie); return Redirect(Request.QueryString["returnUrl"]);
}

isPersistent:是否将cookie持久化保存到客户端硬盘。一般应该选择false,即每次访问都要登录。但可以将用户名保存到客户端,用户登录时直接取得并设为默认。

HttpCookie userNmaecook=new HttpCookie("MyAppUserName",userName);
vljidcook.Expires=DateTime.Now.AddDays();
this.Context.Response.Cookies.Add(userNmaecook);

4. 使用角色信息控制用户对Controller 或 Action 的访问 , 因为我们上面设置用户拥有admin , user , powerUser 角色, 所以用户有权访问此方法

public class HomeController : Controller
{
[Authorize(Roles="admin,powerUser")]
public ActionResult Index()
{
//用户拥有 admin,user,powerUser 角色, 所以可以访问此方法。
return View();
}
}

一般权限应按ontroller设置,后台管理和前台浏览使用不同的controller。

5. 以下是AuthorizeAttribute AuthorizeCore方法的源码 , 我们可以看到其中只要用户有AuthorizeAttribute.Roles设置中的任意角色, 就可以通过AuthorizeAttribute 的审核

// This method must be thread-safe since it is called by the thread-safe OnCacheAuthorization() method.
protected virtual bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException("httpContext");
} IPrincipal user = httpContext.User;
if (!user.Identity.IsAuthenticated)
{
return false;
} if (_usersSplit.Length > && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase))
{
return false;
} if (_rolesSplit.Length > && !_rolesSplit.Any(user.IsInRole))
{
return false;
} return true;
}

给Asp.net MVC Forms 验证设置角色访问控制的更多相关文章

  1. 【MVC】ASP.NET MVC Forms验证机制

    http://www.cnblogs.com/bomo/p/3309766.html 随笔 - 121  文章 - 0  评论 - 92 [MVC]ASP.NET MVC Forms验证机制 ASP. ...

  2. ASP.NET MVC Forms验证机制

    ASP.NET MVC 3 使用Forms身份验证 身份验证流程 一.用户登录 1.验证表单:ModelState.IsValid 2.验证用户名和密码:通过查询数据库验证 3.如果用户名和密码正确, ...

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

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

  4. ASP.NET MVC异步验证是如何工作的03,jquery.validate.unobtrusive.js是如何工作的

    在上一篇"ASP.NET MVC异步验证是如何工作的02,异步验证表单元素的创建"中了解了ASP.NET异步验证是如何创建表单元素的,本篇体验jquery.validate.uno ...

  5. Asp.Net的Forms验证,解决Cookie和Seesion失效时间

    网站开发中用户验证一般采用Asp.Net的Forms验证,验证票据存储到Cookie的方式. Session方式是将验证信息存储在内存中,如果你使用的虚拟主机给你分配很小的内存,实际上都是如此,那么s ...

  6. ASP.NET MVC Model验证(五)

    ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...

  7. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...

  8. ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

    在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie ...

  9. 通过扩展改善ASP.NET MVC的验证机制[实现篇]

    原文:通过扩展改善ASP.NET MVC的验证机制[实现篇] 在<使用篇>中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离.多语言的支持和多验证规则的支持, ...

随机推荐

  1. 网易云课堂学习之VS相关

    1.为开发好的项目文件瘦身 如:在项目文件ScreenCapture中,只需保留框起来的两个文件即可 而且在框起来的ScreenCapture里的Debug文件也可以删掉,整个文件由75.4 MB变为 ...

  2. Linux同步机制(一) - 线程锁

    1 互斥锁 在线程实际运行过程中,我们经常需要多个线程保持同步. 这时可以用互斥锁来完成任务.互斥锁的使用过程中,主要有 pthread_mutex_init pthread_mutex_destor ...

  3. CSS中position:fixed的用法

    我们都知道CSS中定位属性position的值,除了默认的值外,还有absolute,relative和fixed.我平时比较常用absolute和relative,而position:fixed却没 ...

  4. Android微信SDK API 调用教程1

    最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走. 1.申请App_ID 2.填写包名3. 获取程序签名的md5值, 这三 ...

  5. spring mvc 自定义转换器

    <!-- 注册转化器 --> <mvc:annotation-driven conversion-service="conversionService" /> ...

  6. 四、Emmet:快速编写HTML,CSS代码的有力工具

    介绍 Emmet是一个插件,在IDE中安装该插件后即可使用该功能. HTML代码写起来虽简单,但是重复代码很多,Emmet能够存在一种HTML代码简写法(比较类似CSS的选择器写法),比如 div.c ...

  7. 如何拷贝CMD命令行文本到粘贴板

    /********************************************************************* * 如何拷贝CMD命令行文本到粘贴板 * To copy ...

  8. ecshop 更新首页flash样式

    未测试 ECSHOP默认的只有几种很普通的FLASH图片切换样式,想不想自己也换一种呢? 今天摸索了下,算是弄懂了,和大家分享下 首先在网上找到你想要的FLASH切换样式[google一下],把那个S ...

  9. java web项目导入问题

    由于工作问题,接触到很多其他人的项目,有时候想要直接跑起来,还是需要一定的耐力. 1:导入不进去,干脆新建项目,一个个复制进去: 2:第三方jar包不要忘记,核实jdk    j2ee的版本,编译路径 ...

  10. library cache lock和cursor: pin S wait on X等待

    1.现象: 客户10.2.0.4 RAC环境,出现大量的library cache lock和cursor: pin S wait on X等待,经分析是由于统计信息收集僵死导致的.数据库在8点到9点 ...