Asp.net Mvc4默认权限详细(上)
Asp.net Mvc4默认权限详细(上)
前言
上篇的菜鸟去重复之Sql的问题还没有得到满意的答案。如果哪位大哥有相关的资料解释,能够分享给我,那就太谢谢了。
以后每发表一篇博文我都会将以前遗留的问题在前言里指出,直到解决为止。
本文主要在于探讨一下Asp.net Mvc4默认生成的权限的详细内容。
介绍
在VS2012中创建一个默认的带有权限的MVC4 Internet项目,如下图。

生成项目后点运行,在浏览器里点登陆。然后观察项目,此刻生成了数据库,如下。

本文就是针对这样的模版项目里的已有权限全面的分析,希望大家能够从中学到一些东西,如果有问题,请指出。PS:欢迎大家共同讨论进步。
有趣的Attribute

上图中有三个ActionFilter,不清楚ActionFilter的童鞋请点击这里。
AuthorizeAttribute:表示一个特性,该特性用于限制调用方对操作方法的访问。
AllowAnonymousAttribute:表示一个特性,该特性用于标记在授权期间要跳过 AuthorizeAttribute 的控制器和操作。
InitializeSimpleMembershipAttribute:这个特性是来初始化数据库成员关系的,后面会讲到。
Authorize
这个Attribute是用来对用户角色权限限制的,大家应该都清楚,此处就不多说了。
AllowAnonymous
这个Attribute似乎是MVC4才加进去的。大致意思看一下上面的解释应该也了解了。其实就是微软团队在Authorize的实现里面加了对AllowAnonymous的判断,如果方法上有这个Attribute就不限制。
真相在这里(反编译的),这个是Authorize的OnAuthorization方法,有兴趣的童鞋可以看看12行。

1 public virtual void OnAuthorization(AuthorizationContext filterContext)
2 {
3 if (filterContext == null)
4 {
5 throw new ArgumentNullException("filterContext");
6 }
7 if (OutputCacheAttribute.IsChildActionCacheActive(filterContext))
8 {
9 throw new InvalidOperationException(MvcResources.AuthorizeAttribute_CannotUseWithinChildActionCache);
10 }
11 bool inherit = true;
12 if (!filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit) && !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
13 {
14 if (this.AuthorizeCore(filterContext.HttpContext))
15 {
16 HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
17 cache.SetProxyMaxAge(new TimeSpan(0L));
18 cache.AddValidationCallback(new HttpCacheValidateHandler(this.CacheValidateHandler), null);
19 }
20 else
21 {
22 this.HandleUnauthorizedRequest(filterContext);
23 }
24 }
25 }

下面就到了主要的关于默认权限的关键Attribute。
InitializeSimpleMembership
我们先来看下它的实现

1 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
2 public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
3 {
4 private static SimpleMembershipInitializer _initializer;
5 private static object _initializerLock = new object();
6 private static bool _isInitialized;
7
8 public override void OnActionExecuting(ActionExecutingContext filterContext)
9 {
10 // Ensure ASP.NET Simple Membership is initialized only once per app start
11 LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
12 }
13
14 private class SimpleMembershipInitializer
15 {
16 public SimpleMembershipInitializer()
17 {
18 Database.SetInitializer<UsersContext>(null);
19
20 try
21 {
22 using (var context = new UsersContext())
23 {
24 if (!context.Database.Exists())
25 {
26 // Create the SimpleMembership database without Entity Framework migration schema
27 ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
28 }
29 }
30 WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
31 }
32 catch (Exception ex)
33 {
34 throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
35 }
36 }
37 }
38 }

这个Atrribute里面实现了创建我们起初见到的数据库。
现在让我们来看看具体是如何实现的。这个创建数据库的方式还是和以前使用Code First有点出入的。
4-12行 主要是定义了几个变量并重写OnActionExcuting,实现了确保Asp.net成员关系只初始化一次。我们可以料到,必然在LazyInitializer.EnsureInitialized函数里面实例化了SimpleMembershipInitializer。
只初始化一次就意味着不会调用SimpleMembershipInitializer的构造函数两次。其实看代码我们应该也大致能猜到,这个构造函数里面主要做的就是创建数据库的功能,当然最好只实现一次。
22-29行 主要就是调用方法创建UsersContext的数据库,相关代码如下

public class UsersContext : DbContext
{
public UsersContext()
: base("DefaultConnection")
{
} public DbSet<UserProfile> UserProfiles { get; set; }
} [Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
}

我们从上面可以了解到UsersContext继承DbContext,并以DefaultConnection字符串为连接字符串,有一张表UserProfile。
那这时我们就会有疑问了,在文章开头介绍里的那几个标出来的表是如何生成的呢。先别急,我们继续往下看
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
这句话的字面意思一看就猜到了。初始化数据库连接使用连接字符串Default,表UserProfile,字段UserId,UserName,自动创建表。
可是我们之前已经使用UserContext的CreateDatabase()创建过数据库和表了。难道再重新创建一次!!?好吧!还是让我们看看MSDN的解释吧!
InitializeDatabaseConnection()
通过连接到包含用户信息的数据库来初始化成员资格系统。
注释
在应用程序启动时调用此方法(在 _AppStart.cshtml 或 _AppStart.vbhtml 文件中),以初始化简单成员资格系统。此方法验证成员资格数据库是否存在。它还打开到用户配置文件表的连接,并在成员资格数据和用户配置文件数据之间建立 数据库关系。
如果希望使用包含用户配置文件信息(用户名、电子邮件地址等)的数据库表,则应指定成员资格系统用于连接到那些信息的连接字符串和表名称。如果不希望使用现有用户配置文件表,则可指定 InitializeDatabaseConnection() 方法应自动创建用户配置文件表。(用户配置文件表的数据库必须已经存在。)
下面是方法的五个参数解释:
connectionStringName包含用户信息的数据库的连接字符串的名称。如果使用的是 SQL Server Compact,此名称可以是一个不带 .sdf 文件扩展名的数据库文件(.sdf 文件)的名称。userTableName
包含用户配置文件信息的数据库表的名称。
userIdColumn
包含用户 ID 的数据库列的名称。此列必须以整数 (int) 形式键入。
userNameColumn
包含用户名的数据库列的名称。此列用于匹配用户配置文件数据与成员资格帐户数据。
autoCreateTables
若为 true,则指示应创建用户配置文件表和成员资格表(如果它们不存在)。若为 false,则指示不应自动创建这些表。虽然可以自动创建成员资格表,但数据库本身必须已经存在。
我的理解
这个方法会对已有的数据库进行分析,如果没有提前创建数据库,调用此方法会报错。
如果已经创建一个空的数据库并且不存在参数对应的userTableName表,设置autoCreateTables为true,会自动创建该参数名的表,字段与userIdColumn及userNameColumn一一对应,并创建其余的四个成员资格表。
如果设置autoCreateTables为false,不会自动创建任何表。
设置autoCreateTables为true,如果已经使用UserContext创建user表,要把表名与UserId、UserName的字段名作为参数赋给InitializeDatabaseConnection()方法作为参数,表名不一致,数据库会多创建一个User表,并以方法参数名的那个来使用webSecurity的方法。字段名不一致,使用webSecurity的方法时会报错。
至此,我们已经大致知道起初见到的那几个数据表是如何生成的了。对,就是webSecurity.InitializeDatabaseConnection方法里自动实现的。
小结
本来打算把默认生成权限的这部分内容尽可能的在一篇里面说完,但写本篇博客的过程中发现需要写的有点多。
奈何我本是菜鸟,内容稍微多了点,就越发感觉脑子有点乱,所以打算分成两篇来写。
呵呵!目前还没有实力写长篇,那得需要思维足够清晰,我还需要锻炼啊!
下篇我打算写一下WebSecurity,SimpleMemberShip,RoleProvider之间的关系,以及它们的使用场合,希望有兴趣的童鞋继续关注!
最后,如果本文有什么问题,还请指出。如果对您有帮助,请帮忙推荐给我更多动力!
Asp.net Mvc4默认权限详细(上)的更多相关文章
- 转:Asp.net Mvc4默认权限详细(上)
前言 上篇的菜鸟去重复之Sql的问题还没有得到满意的答案.如果哪位大哥有相关的资料解释,能够分享给我,那就太谢谢了. 以后每发表一篇博文我都会将以前遗留的问题在前言里指出,直到解决为止. 本文主要在于 ...
- Asp.net Mvc4默认权限详细(下)
前言 菜鸟去重复之Sql的问题还没有得到满意的答案.如果哪位大哥有相关的资料解释,能够分享给我,那就太谢谢了. 以后每发表一篇博文我都会将以前遗留的问题在前言里指出,直到解决为止. 本文主要在于探讨一 ...
- 【要什么自行车】ASP.NET MVC4笔记02:上传文件 uploadify 组件使用
参考:http://www.cnblogs.com/luotaoyeah/p/3321070.html 1.下载 uploadify 组件,copy至 Content文件夹 <link href ...
- Asp.net MVC4 ExtJS权限管理系统源码 C#开发框架源码
开发环境:VS2010或以上 数据库:SQL Server 2008 r2 MVC版本:Asp.net mvc 4.0 ExtJs版本:ext-4.2 功能介绍 1.多标签,js动态加载模式,全a ...
- CentOS上 Mono 3.2.8运行ASP.NET MVC4经验
周一到周三,折腾了两天半的时间,经历几次周折,在小蝶惊鸿的鼎力帮助下,终于在Mono 3.2.8上运行成功MVC4.在此总结经验如下: 系统平台的版本: CentOS 6.5 Mono 3.2.8 J ...
- Asp.net mvc4 快速入门之构建表单
1.asp.net mvc4 Index.cshtml页面上构建表单form的方式 @{ ViewBag.Title = "Index"; Layout = "~/Vi ...
- 从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程
从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程 用户登录与权限验证是网站不可缺少的一部分功能,asp.net MVC4框架内置了用于实现该功能的类库,只需要简单搭 ...
- ASP.NET MVC4+EasyUI+EntityFrameWork5权限管理系统——菜单模块的实现(二)
ASP.NET MVC4+EasyUI+EntityFrameWork5权限管理系统——数据库的设计(一) 菜单和模块是在同一个表中,采用的是树形结构,模块菜单表结构如下代码: USE [Permis ...
- 最新版CentOS6.5上安装部署ASP.NET MVC4和WebApi
最新版CentOS6.5上安装部署ASP.NET MVC4和WebApi 使用Jexus5.8.1独立版 http://www.linuxdot.net/ ps:该“独立版”支持64位的CentOS ...
随机推荐
- linux内核源码目录(转)
Linux用来支持各种体系结构的源代码包含大约4500个C语言程序,存放在270个左右的子目录下,总共大约包含200万行代码,大概占用58MB磁盘空间. 源代码所有在目录:/usr/src/linux ...
- PHP 调用微信JS-SDK 开发详解 [网摘]
一:准备文件,并将文件置于网站根目录下 access_token.json {"access_token":"","expire_time" ...
- qml能够这么玩
Qt 5以后qmlscene被qml所替代,/usr/bin/qml能够用来执行.qml文件.所以,我们就能够和sh一样的来写界面了. #!/usr/bin/env qml import QtQuic ...
- 微信应用号开发知识贮备之altjs官方实例初探
天地会珠海分舵注:随着微信应用号的呼之欲出,相信新一轮的APP变革即将发生.从获得微信应用号邀请的业内人士发出来的一张开发工具源码截图可以看到,reacjs及其相应的FLUX框架altjs很有可能会成 ...
- sp.Net MVC4 + Oracle + EasyUI + Bootstrap2
Asp.Net MVC4 + Oracle + EasyUI + Bootstrap 第二章 Asp.Net MVC4 + Oracle + EasyUI + Bootstrap 第二章 --使用 ...
- Java之多线程
一.简述进程与线程的关系 说到多线程就不得不说进程,那么什么是进程:简单的来说就是正在进行中的程序. 在windows中,我们可以直观的看到的正在运行中的程序,即进程,如图:
- c#万能视频播放器(附代码)
原文:c#万能视频播放器(附代码) c#万能视频播放器 本人之前很多的文章中均提到了使用libvlc为播放器内核制作的播放器,也许有些朋友对此感兴趣,于是我用c#写了一个调用libvlc api实现的 ...
- sql点滴38—SQL Server 2008和SQL Server 2008 R2导出数据的选项略有不同
原文:sql点滴38—SQL Server 2008和SQL Server 2008 R2导出数据的选项略有不同 说明: 以前要将一个表中的数据导出为脚本,只有用存储过程.现在在SQL Server ...
- 快速构建Windows 8风格应用26-本地应用数据
原文:快速构建Windows 8风格应用26-本地应用数据 本篇博文主要介绍如何获取应用的设置和文件容器.如何将数据写入设置.如何从设置中获取数据.如何删除设置中数据.如何将数据写入文件.如何从文件中 ...
- leetcode第十题--Regular Expression Matching
Problem:Implement regular expression matching with support for '.' and '*'. '.' Matches any single c ...