七天学会ASP.NET MVC (四)——用户授权认证问题 【转】
2016-05-18 14:05
567 查看
http://www.cnblogs.com/powertoolsteam/p/MVC_four.html
小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会Asp.NetMVC第四篇出炉,在第四天的学习中,我们主要了学习如何在MVC中如何实现认证授权等问题,本节主要讲了验证错误时的错误值,客户端验证,授权认证及登录注销功能的实现。系列文章
[b]
[b][b]
目录
实验15——有关错误验证的保留值。实验16——添加客户端验证
实验17——添加授权认证
实验18——在View中显示用户名
实验19——实现注销操作
实验20——实现登录页面验证
实验21——实现登录页面客户端验证
总结
实验15——有关错误验证的保留值
在上一节的实验13,我们介绍了服务器端的身份验证,实验14中添加了客户端验证的支持,希望每位读者都能够把实验14理解透彻,逐行代码查看,保证每行代码都理解了,这样才有助于理解我们接下来的实验。实验15中将学习如何在验证失败时,填充值。
1.创建CreateEmployeeViewModel类。
在ViewModel文件夹下,新建类:
publicclassCreateEmployeeViewModel
[code]{
publicstringFirstName{get;set;}
publicstringLastName{get;set;}
publicstringSalary{get;set;}
}
[/code]
2.修改SaveEmployee方法
为了重新生成,重用ModelBinder创建的Employee对象,修改SaveEmployee方法。
[code]
[/code]
3.填充View的值
3.1将View设置为强类型的View
在CreateEmployeeView文件开始添加以下代码:
[code]
[/code]
3.2在响应控件中显示Model值
[code]
[/code]
4.运行点击AddNew链接
浏览器提示错误。我们在实验讲述完之后,再来解释为什么会出现错误。
5.修改AddNew方法
[code]
[/code]
6.运行测试
测试1
点击“AddNew”跳转到AddNew页面。
设置名字为空
输入工资值56
点击“SaveEmployee”按钮。
会出现验证失败,但是数字56仍然显示在Salary文本框中。
测试2
如图所示,姓名仍然保留在文本框中,却未保留工资,接下来我们来讨论上述问题的解决办法。
关于实验15
是否是真的将值保留?不是,是从post数据中重新获取的。
为什么需要在初始化请求时,在AddNew方法中传递newCreateEmployeeViewModel()?
View中,试着将Model中的数据重新显示在文本框中。
如:
<inputid="TxtSalary"name="Salary"type="text"value="@Model.Salary"/>
如上所示,可以访问当前Model的“FirstName”属性,如果Model为空,会抛出类无法实例化的异常“Objectreferencenotsettoaninstanceoftheclass”。
当点击”AddNew“超链接时,请求会通过AddNew方法处理,在该Action方法中,可以不传递任何数据。即就是,View中的Model属性为空。因此会抛出“Objectreferencenotsettoaninstanceoftheclass”异常。为了解决此问题,所以会在初始化请求时,传”newCreateEmployeeViewModel()“。
上述的这些功能,有什么方法可以自动生成?
使用HTML帮助类就可以实现。在实验16中我们会讲解HTML帮助类。
实验16——添加客户端验证
首先了解,需要验证什么?1.FirstName不能为空
2.LastName字符长度不能大于5
3.Salary不能为空,且应该为数字类型
4.FirstName不能包含@字符
接下来,实现客户端验证功能
1.创建JavaScript验证文件
在Script文件下,新建JavaScript文件,命名为“Validations.js”
2.创建验证函数
在“Validations.js”文件中创建验证函数:
[code]
[/code]
3.在“CreateEmployee”View中添加Validations.js文件引用:
4.在点击SaveEmployee按钮时,调用验证函数,如下:
<inputtype="submit"name="BtnSubmit"value="SaveEmployee"onclick="IsValid();"/>
5.运行测试
点击AddNew链接,跳转到”AddNew“页面
测试1
测试2
关于实验16
为什么在点击”SaveEmployee“按钮时,需要返回关键字?如之前实验9讨论的,当点击提交按钮时,是给服务器发送请求,验证失败时对服务器请求没有意义。通过添加”returnfalse“代码,可以取消默认的服务器请求。
在IsValid函数将返回false,表示验证失败来实现预期的功能。
除了提示用户,是否可以在当前页面显示错误信息?
是可以得,只需要为每个错误创建span标签,默认设置为不可见,当提交按钮点击时,如果验证失败,使用JavaScript修改错误的可见性。
自动获取客户端验证还有什么方法?
是,当使用Html帮助类,可根据服务端验证来获取自动客户端验证,在以后会详细讨论。
服务器端验证还有没有必须使用?
在一些JavaScript脚本代码无法使用时,服务器端可以替代使用。
实验17添加授权认证
在实验17中,会改进GetView方法,使其变得更加安全,只有合法的用户才能够访问该方法。在本系列的第一讲中,我们了解了Asp.Net和MVC的意义,知道MVC是Asp.net的一部分,MVC继承了ASP.NET的所有特征,包含表单认证。
先来了解ASP.NET是如何进行Form认证的。
终端用户在浏览器的帮助下,发送Form认证请求。
浏览器会发送存储在客户端的所有相关的用户数据。
当服务器端接收到请求时,服务器会检测请求,查看是否存在“AuthenticationCookie”的Cookie。
如果查找到认证Cookie,服务器会识别用户,验证用户是否合法。
如果为找到“AuthenticationCookie”,服务器会将用户作为匿名(未认证)用户处理,在这种情况下,如果请求的资源标记着protected/secured,用户将会重定位到登录页面。
1.创建AuthenticationController和Login行为方法
右击controller文件夹,选择添加新Controller,新建并命名为”Authentication“即Controller的全称为”AuthenticationController“。
新建Loginaction方法:
[code]
[/code]
2.创建Model
在Model文件夹下新建Model,命名为UserDetails。
[code]
[/code]
3.创建LoginView
在“~/Views/Authentication”文件夹下,新建View命名为Login,并将UserDetails转换为强View类型。
在View中添加以下代码:
[code]
[/code]
在上述代码中可以看出,使用HtmlHelper类在View中替代了纯HTML代码。
View中可使用”Html”调用HtmlHelper类
HtmlHelper类函数返回html字符串
示例1:
转换为HTML代码
<inputid="UserName"name="UserName"type="text"value=""/>
示例2:
[code]
[/code]
转换为HTML代码:
[code]
[/code]
4.运行测试
输入Loginaction方法的URL:“http://localhost:8870/Authentication/Login”
5.实现Form认证
打开Web.config文件,在System.Web部分,找到Authentication的子标签。如果不存在此标签,就在文件中添加Authentication标签。
设置Authentication的Mode为Forms,loginurl设置为”Login”方法的URL.
[code]
[/code]
[code]
[/code]
7.运行测试,输入EmployeeController的Indexaction的URL:“http://localhost:8870/Employee/Index”
对于Indexaction的请求会自动重链接到loginaction。
8.创建业务层功能
打开EmployeeBusinessLayer类,新建IsValidUser方法:
[code]
[/code]
9.创建DoLoginaction方法
打开AuthenticationController类,新建action方法命名为DoLogin。
当点击登录时,Dologinaction方法会被调用。
Dologin方法的功能:
通过调用业务层功能检测用户是否合法。
如果是合法用户,创建认证Cookie。可用于以后的认证请求过程中。
如果是非法用户,给当前的ModelState添加新的错误信息,将错误信息显示在View中。
[code]
[/code]
10.在View中显示信息
打开LoginView,在@Html.BeginForm中添加以下代码
[code]
[/code]
11.运行测试
测试1
测试2
关于实验17
为什么Dologin会添加HttpPost属性,还有其他类似的属性吗?该属性可使得DoLogin方法打开Post请求。如果有人尝试获取DoLogin,将不会起作用。还有很多类似的属性如HttpGet,HttpPut和HttpDelete属性.
FormsAuthentication.SetAuthCookie是必须写的吗?
是必须写的。让我们了解一些小的工作细节。
客户端通过浏览器给服务器发送请求。
当通过浏览器生成,所有相关的Cookies也会随着请求一起发送。
服务器接收请求后,准备响应。
请求和响应都是通过HTTP协议传输的,HTTP是无状态协议。每个请求都是新请求,因此当同一客户端发出二次请求时,服务器无法识别,为了解决此问题,服务器会在准备好的请求包中添加一个Cookie,然后返回。
当客户端的浏览器接收到带有Cookie的响应,会在客户端创建Cookies。
如果客户端再次给服务器发送请求,服务器就会识别。
FormsAuthentication.SetAuthCookie将添加“Authentication”特殊的Cookie来响应。
是否意味着没有Cookies,FormsAuthentication将不会有作用?
不是的,可以使用URI代替Cookie。
打开Web.Config文件,修改Authentication/Forms部分:
授权的Cookie会使用URL传递。
通常情况下,Cookieless属性会被设置为“AutoDetect“,表示认证工作是通过Cookie完成的,是不支持URL传递的。
FormsAuthentication.SetAuthCookie中第二个参数”false“表示什么?
false决定了是否创建永久有用的Cookie。临时Cookie会在浏览器关闭时自动删除,永久Cookie不会被删除。可通过浏览器设置或是编写代码手动删除。
当凭证错误时,UserName文本框的值是如何被重置的?
HTML帮助类会从Post数据中获取相关值并重置文本框的值。这是使用HTML帮助类的一大优势。
Authorize属性有什么用?
Asp.netMVC中提供四种过滤器来过滤请求和响应的,Authorize属性是在Authorize过滤器之后执行的,可以确保授权请求Action方法处理。
需要为每个Action方法添加授权属性吗?
不需要,可以将授权属性添加到Controller层或Global层。
实验18——在View中显示UserName
在本实验中,我们会在View中显示已登录的用户名1.在ViewModel中添加UserName
打开EmployeeListViewModel,添加属性叫:UserName。
[code]
[/code]
2.给ViewModelUserName设置值
修改EmployeeController,修改Index方法。
[code]
[/code]
3.显示ViewUserName
[code]
[/code]
4.运行
实验19——实现注销功能
1.创建注销链接,打开Index.cshtml创建Logout链接如下:[code]
[/code]
2.创建LogoutAction方法
打开AuthenticationController添加新的Logoutaction方法:
[code]
[/code]
3.运行
实验20——实现登录页面验证
1.添加dataannotation打开UserDetails.cs,添加DataAnnotation:
[code]
[/code]
2.在View中显示错误信息
修改Login.cshtml能够提示错误信息。
[code]
[/code]
3.修改DoLogin
修改DoLoginaction方法:
[code]
[/code]
4.运行
实验21——登录页面实现客户端验证
在本实验中介绍一种方法实现客户端验证1.下载jQueryunobtrusiveValidation文件
右击项目,选择“ManageNugetpackages”,点击在线查找”jQueryUnobtrusive“,安装”MicrosoftjQueryUnobtrusiveValiadtion“
2.在View中添加jQueryValidation引用
在Scripts文件中,添加以下JavaScript文件
jQuery-Someversion.js
jQuery.valiadte.js
jquery.validate.unobtrusive
打开Login.cshtml,在文件顶部包含这三个js文件:
[code]
[/code]
3.运行
关于实验21
客户端验证是如何实现的?如上所述,客户端验证并不是很麻烦,在LoginView中,HTML元素能够使用帮助类来生成,Helper函数能够根据DataAnnotation属性的使用生成带有属性的HTML标记元素。
例如:
[code]
[/code]
根据以上代码生成的HTML代码如下:
[code]
[/code]
jQueryUnobtrusive验证文件会使用这些自定义的HTML属性,验证会在客户端自动生成。自动进行客户端验证是使用HTML帮助类的又一大好处。
是否可以使用不带HTML帮助类的JavaScript验证?
是,可手动添加属性。
总结
这就是本节所讲的用户授权与客户端验证的实现,在第五天我们会讲到更高级的应用,请持续关注,不要走开哦!要进行ASP.ETMVC的开发,不但需要具备MVC的知识,还需要高效的工具来帮助开发。
使用
原文链接
相关文章推荐
- 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理 【转】
- 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 【转】
- 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 【转】
- Asp.net MVC中 Controller 与 View之间的数据传递
- C#实现二维码功能,winform 以及 asp.net均可以用
- ASP.NET Aries 开源开发框架:开发指南(一)
- asp.net MVC SignalR 与数据库 实时同步显示
- Asp.net中WebForm 与 MVC的架构区别
- Web API路由
- ASP.NET Core 开发 - Entity Framework (EF) Core
- 在ASP.NET 2.0中操作数据之六十四:GridView批量添加数据
- 在ASP.NET 2.0中操作数据之六十三:GridView实现批量删除数据
- 一点一点学ASP.NET之基础概念——委托
- ASP.NET MVC Ajax.ActionLink 简单用法
- 在ASP.NET 2.0中操作数据之六十二:GridView批量更新数据
- (0)ASP.NET Core 简单介绍 和开发环境搭建 - ASP.NET从MVC5升级到MVC6
- ASP.NET从MVC5升级到MVC6 RC2 总目录 - 发布在RC2Release之后
- Asp.Net 网站一键部署技术(下)
- 在ASP.NET 2.0中操作数据之六十一:在事务里对数据库修改进行封装
- 在ASP.NET 2.0中操作数据之六十:创建一个自定义的Database-Driven Site Map Provider