您的位置:首页 > 编程语言 > ASP

七天学会ASP.NET MVC (四)——用户授权认证问题 【转】

2016-05-18 14:05 567 查看

http://www.cnblogs.com/powertoolsteam/p/MVC_four.html

小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会Asp.NetMVC第四篇出炉,在第四天的学习中,我们主要了学习如何在MVC中如何实现认证授权等问题,本节主要讲了验证错误时的错误值,客户端验证,授权认证及登录注销功能的实现。

系列文章

七天学会ASP.NETMVC(一)——深入理解ASP.NETMVC

七天学会ASP.NETMVC(二)——ASP.NETMVC数据传递

七天学会ASP.NETMVC(三)——ASP.NetMVC数据处理

七天学会ASP.NETMVC(四)——用户授权认证问题

七天学会ASP.NETMVC(五)——Layout页面使用和用户角色管理

[b]七天学会ASP.NETMVC(六)——线程问题、异常处理、自定义URL[/b]

[b][b]七天学会ASP.NETMVC(七)——创建单页应用[/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.创建AuthenticationControllerLogin行为方法

右击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]


6.让Action方法更安全
在Indexaction方法中添加认证属性[Authorize].

[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的知识,还需要高效的工具来帮助开发。

使用ComponentOneStudioEnterprise中提供的ComponentOneStudioASP.NETMVC版本,您能获取快速的轻量级控件来满足用户所有需求。

原文链接http://www.codeproject.com/Articles/996832/Learn-MVC-Project-in-Days-Day
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: