【Pro ASP.NET MVC 3 Framework】.学习笔记.9.SportsStore:Securing the Administration Features
1 设置表单身份认证
因为ASP.NET MVC基于ASP.NET平台的核心,所以我们可以使用ASP.NET Form的身份认证,这是保持用户登录轨迹通用的方法。现在介绍最基本的配置。
在Web.config文件中,有这么一段
表单身份认证自动地被空的模板或Internet程序模板MVC程序启用。当需要要认证时,loginUrl属性告诉ASP.NET,定向到哪个URL。在这里,会定向到/Account/Logon页面。timeout属性指定用户登陆后,过期时间。
表单身份认证主要可选的是Windows authentication,使用操作系统证书来识别用户。这在部署企业内网程序时很方便,所有的用户都在痛一个windows domain。但是不适用internet程序。
如果我们选择MVC Internet程序模板,VS会创建AccountController类和它的LogOn action方法。这个方法的实现,会使用核心的ASP.NET成员资格特性,来管理账号和密码。
简单地实现它,我们指定同意进入管理特性的账号密码。
我们决定简单点,将用户名和密码硬编码到Web.config文件。大多数网络程序使用表单身份验证,在数据库中存储用户的认证信息。
2 应用带过滤器的身份认证
MVC框架有个强大的特性叫做filters,这是一个可以应用给action方法或controller类的.NET特性。当请求被处理时,它采用附加的逻辑。不同类型的过滤器都可以使用,也可以创建自己的自定义顾虑器。当前我们感兴趣的是Authorize过滤器,默认身份验证过滤器。我们将它应用在AdminController类上。
当使用Authorize属性,不带任何参数时,如果用户已验证,它同意进入controller action方法。这意味着如果你已经验证,你可以自动地经过授权地使用administation特性。这里只有一组受限制的action方法和一个使用者,这对SportsStore很好。你会看到如何有选择地应用Authorize过滤器,来区分authentication(被系统识别的)和 authorized(被允许访问给定的action方法)。
你可以应用过滤器给一个个体action方法或controller。当你应用一个过滤器给controller,它会应用给controller类中的每个action方法。我们给AdminController类使用了Authorize过滤器,它所有的action方法只对已验证的用户可用。
导航到/Admin/Index URL时,你会看到Authorize过滤器的效果。当试图访问Admin controller的Index action方法,MVC框架发现Authorize过滤器。因为你还没有被认证,被重定向到Web.config表单身份验证节点指定的URL:Account/LogOn。我们还没有创建Account controller,但是身份验证系统已经在工作。
3 创建身份验证提供者
使用表单身份认证特性,需要我们调用System.Web.Security.FormAuthentication类的两个静态方法:
- Authenticate(认证,鉴定)方法,让我们验证用户提供的认证信息
- SetAuthCookie方法,添加一个cookie到response到浏览器,所以用户不需要在他们每次请求时都被认证。
在action方法中调用静态方法的问题是,它使得controller的单元测试变得困难。Mocking框架,如Moq,只能mock成员的实例。问题的出现时因为FormAuthentication类被MVC设计为,早于单元测试运行。最好的解决方法,使用一个带静态方法的接口,解耦controller。这样做,附加的好处是,它适用于广泛的MVC设计模式,并使得它在以后易于切换成不同的身份认证系统。
我们从定义身份认证提供者接口开始。在Infrastructure文件夹创建新的Abstract文件夹,在它里面添加IAuthProvider接口。
然后创建它的实现,来扮演FormsAuthentication类的静态方法的包装。在Infrastructure文件夹中,创建另一个新文件夹Concrete,在它里面新建一个FormsAuthProvider类。
Auhtenticate模型的实现,调用我们想要留在controller外面的静态方法。最后一步是在NinjectControllerFactory类的AddBindings方法中注册FormAuthProvider。
4 创建Account Controller
下一步的任务是创建Account controller和LogOn action方法。事实上,我们会创建两个版本的LogOn方法。第一个会渲染包含登录提示的视图。另一在用户提交他们的认证信息时,处理POST请求。
首先,我们要创建一个在controller和view之间传递的视图模型。在Models文件夹中创建新类LogOnViewModel:
使用data annotations指定这些属性是必须的,使用DateType属性告诉MVC框架Password属性显示。也许你会觉得用ViewBag传递数据给视图更好。然而,这时一个很好的实践,定义视图模型,让数据从controller传递到view,从模型绑定到action方法。这允许我们使用template view helpers更简单。
接着,创建一个AccountController
5 创建视图
为LogOn action方法创建LogOn强类型视图,模式为LogOnViewModel。
DataType属性让MVC框架渲染Password属性诶HTML password-input元素,这意味着字符不可见。Required属性会强制使用客户端校验(需要引用required JavaScript的库文件).当偶们调用FormAuthentication.Authenticate方法,身份验证会在服务端执行。
一般,使用客户端校验很好,它不用从服务器加载东西,立即返回。然而,你不能试图执行身份校验在客户端,因为代表性地发送验证信息到客户端,他们可以用来检查可以进入的username和password,或者最少信任客户端发回的通过身份验证的报告。身份验证必须总是在服务端执行。
当我们接收到错误的认证信息,我们在ModelState中添加作物信息,并将它渲染到视图。我们的消息显示在验证汇总区域,通过调用Html.ValidationSummary helper方法。我们调用它,使用一个bool参数值true。这样做它不在属性元素旁边显示验证信息,只在汇总区域显示。
5.1 身份验证的单元测试
要测试两个特性,当用户提供可用的验证信息时通过验证,当用户提供不可用的信息时不通过验证。创建IAuthProvider接口的mock实现,并检查controller LogOn方法的原生结果和类型。
最好使用SSL(Secure Sockets Layer),请求验证的验证信息和身份验证cookie(为随后识别客户)会通过secure connection传送。
【Pro ASP.NET MVC 3 Framework】.学习笔记.9.SportsStore:Securing the Administration Features的更多相关文章
- Pro ASP.NET MVC 5 Framework.学习笔记.6.3.MVC的必备工具
每个MVC程序员的军火库中,都有这三个工具:一个依赖注入(DI)容器,一个单元测试框架,一个模拟工具. 1.准备一个示例项目 创建一个ASP.NET MVC Web Application的Empty ...
- Pro ASP.NET MVC 5 Framework.学习笔记.6.4.MVC的必备工具
2.5.创建链式依赖 当你请求Ninject创建一个类型,它检查该类型的依赖是否声明.它也会检查该依赖是否依赖其他类型.如果这里有附加依赖,Ninject自动解决他们,并创建请求的所有类的实例.正是由 ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- 【Pro ASP.NET MVC 3 Framework】.学习笔记.11.ASP.NET MVC3的细节:概览MVC项目
书Adam The Definitive Guide to HTML5 Adam Applied ASP.NET 4 in Context and Pro ASP.NET 4 到此为止,我们已经学了为 ...
- 【Pro ASP.NET MVC 3 Framework】.学习笔记.12.ASP.NET MVC3的细节:URLs,Routing和Areas
Adam Applied ASP.NET 4 in Context 1 介绍Routing系统 在引入MVC之前,ASP.NET假定被请求的URLs和服务器硬盘上的文件之间有着直接关系.服务器的任务是 ...
- 【Pro ASP.NET MVC 3 Framework】.学习笔记.7.SportsStore:购物车
3 创建购物车 每个商品旁边都要显示Add to cart按钮.点击按钮后,会显示客户已经选中的商品的摘要,包括总金额.在购物车里,用户可以点击继续购物按钮返回product目录.也可以点击Check ...
- ASP.Net MVC开发基础学习笔记:一、走向MVC模式
一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...
- ASP.Net MVC开发基础学习笔记(1):走向MVC模式
一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...
- ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)
前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...
随机推荐
- Android之绚丽的图片游览效果--有点像W7效果,透明的倒影,层叠的图片,渐变的颜色透明度
这里转载一个牛人的博客:http://www.cnblogs.com/tankaixiong/archive/2011/02/24/1964340.html 下面,是我参照他的博客实现的一个效果图.这 ...
- 查看python的路径
>>> import sys >>> sys.path
- C#并发处理-锁OR线程安全?
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客! 当然,题外话说多了,咱进入正题! 背景 基于任务的程序设计.命令式数据并行和任务并行都要求能够支持并发更新的数组.列表和集合 ...
- Unable to instantiate Action...............
当时找了好久都没搞明白,出现这样的问题,可能不是代码错了.将新添加的action不要添加在末尾,这样可能导致这样的问题出现,所以新添加的action最好放置在struts配置文件中间.
- css 滑动按钮样式
<div class="pub_switch_box"> <input type="checkbox" id="pub_switch ...
- tomcat war包部署
平常的开发我们都是通过IDE进行项目的部署,但有时候我们不得不进行手工部署(例如在Server上). 手工部署分为以下几步: 第1步: 用maven打war包 (假如得到的war包名为: appkit ...
- Swift游戏实战-跑酷熊猫 11 欢迎进入物理世界
物理模拟是一个奇妙的事情,以此著名的游戏有愤怒的小鸟.我们在这节将会一起来了解如何设置重力,设置物理包围体,碰撞的检测. 要点: 设置物理检测的代理: 让主场景遵循SKPhysicsContactDe ...
- Leetcode: Palindrome Pairs
Given a list of unique words, find all pairs of distinct indices (i, j) in the given list, so that t ...
- SQL 数据库备、还,附、分,数据查询,聚合函数
认识数据库备份和事务日志备份 数据库备份与日志备份是数据库维护的日常工作,备份的目的是在于当数据库出现故障或者遭到破坏时可以根据备份的数据库及事务日志文件还原到最近的时间点将损失降到最低点. 数据库备 ...
- windows系统调用 进程终止
#include "windows.h" #include "iostream" #include "stdio.h" using name ...