1. 认证与授权机制
l ASP.NET 2.0安全必要性
对于网站而言,用户身份认证与权限管理是非常重要的部分。通过用户名和密码,对用户进行身份验证,并指派他可访问的资源,这部分工作一直都是网站开发的重要内容。
在另外一些情况下,需要根据用户的身份进行权限识别,不同用户访问相同页面,也需要显示不同内容。这设计到用户权限管理部分,也是网站开发的核心内容。
l ASP.NET 2.0角色控制概述
ü ASP.NET 2.0的membership和role manager能够非常好的解决这个问题,不但可以对用户的登陆信息进行统一管理,还可以就用户的权限进行分类管理,让开发者方便的就网站权限与安全性进行设定。这种设定以前都需要我们自己写一个库,但是现在就可以快速的进行设定。
ü ASP.NET 2.0的Login控件更提供了一种非常方便的建造登陆与用户管理信息的方法。
l 认证与授权
ASP.NET 通过与IIS协同工作来进行授权管理。共用两种身份认证方式。
ü 通过查询acls列表或者许可证来判断该访问是否拥有浏览的权利。(acls指可以访问的列表,这个列表记录了访问者是谁,他是否可以访问我们的资源。)
ü 通过URL认证
l 认证方式
当用户以访问某网站的时候。两种授权方式会分别进行不同的动作。第一种认证方式会根据用户的登陆信息来判定asp.net针对该用户所指定的系统账号,然后再判断该系统账号是否对被请求的本地资源有访问权限。(第一种方式主要是通过IIS的配置来实现的,这里不是本文的重点)。第二种身份认证通过检查ASP.NET 配置文件来进行授权认证。
ASP.NET 的页面认证方式中,可以使用以下三种方式进行身份认证。
取值 |
描述 |
None |
不进行授权与身份验证 |
Windows |
基于windows身份验证,首先判断windows用户的身份和组 |
Form |
基于cookie的身份认证机制 |
PassPort |
使用PostPort SDK进行二次开发 |
注:在广域网中不可能使用这种Windows身份验证。域在大也不可能管理的了那么多。
Passport是微软提供的基于广域网的一种识别方式,这种方式比较特殊。有点类似Windows,是指一次登陆处处使用的概念。一旦在Passport登陆以后,所有使用PassPort方式的网站都不需要再进行登陆。身份认证信息都存在你的本地。使用passport的用户都需要对passport sdk进行二次开发。对于一个网站开发来说可能增加了开发的复杂度。所以一般使用Form认证方式就可以了。
通过修改config文件中的authentication属性,可以配置不同的认证方式。
认证方式:
每个网站都有一个Web.nfig文件,这个文件是记录这个网站的配置信息的。其中有这么一段:
<configuration>
<system.web>
<authentication mode = “Forms”/>//授权模式,可以是以上表格中的几种取值,确定认证方式。
</system.web >
</configuration >
ü Windows认证方式
Windows认证方式通过使用windowsprincipal类对用户的windows身份进行判定,然后根据用户所属的windows身份组来进行认证。
示例:Windows Authentication(需要在web.config里加上<authentication mode = “Windows”/>)
<%@ Page Language="C#" runat=server AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<script runat=server>
protected void Page_Load(object sender, EventArgs e)
{
AuthUser.Text = User.Identity.Name;
AuthType.Text = User.Identity.AuthenticationType;
}
</script>
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<span style="font-family: Verdana">使用 Windows Authentication</span><table bordercolor="black"
rules="all" style="font-size: 8pt; font-family: Verdana; border-collapse: collapse;
background-color: #ccccff; bordercolor: black" width="700">
<tr>
<td>
用户:</td>
<td>
<asp:Label ID="AuthUser" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td>
认证方式:</td>
<td>
<asp:Label ID="AuthType" runat="server"></asp:Label>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
运行效果:
使用 Windows Authentication
用户: |
7EDD5807D52E414"qimu |
认证方式: |
NTLM |
说明:7EDD5807D52E414是计算机名。Qmu是我的用户名
NTLM是指windows登陆方式。
这种方式的好处在于,如果是在域集成的用户中,每个用户登陆自己的PC之后,Server端就可以根据他本人的权限在在域中找到他所对应的权限,然后在他登陆网站的时候,用户不需要再输入一次登陆账号和密码了。局域网中使用较多,广域网中使用比较少。
ü From认证方式
From认证方式是在窗体内提供用户输入ID和密码的地方,并根据用户输入的ID和密码进行身份认证。
From认证方式同时还使用cookie记录用户的信息,当用户访问其他页面的时候,程序通过访问cookie来获得用户的身份信息。
Ø From认证方式配置文件
<configuration>
<system.web>
<authentication mode="Forms">
<forms name=".ASPXUSERDEMO" loginUrl="Default2.aspx" protection="All" timeout="60" path = “/”/>
<!--protection = "[All|None|Encryption|Validation]"-->
</authentication>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</configuration>
Ø From认证方式配置文件讲解
配置文件中的属性意义如下表所示
属性 |
描述 |
LoginUrl |
指定一个用于登陆的页面,没有认证直接跳过登陆页面时,自动跳转到登陆页面。 |
Name |
Cookie的名字,注意:如果一个服务器有很多应用的话,要给Cookie起不同的名字。 |
Timeout |
Cookie的存活时间默认值是30分钟 |
Protection |
Cookie被保存的方式,不保护起来将会很麻烦! |
path |
Cookie被保存的时间 |
Ø Protection属性
Protection是用来描述Cookie的保存方式,有下列四个可选择项目。
属性 |
描述 |
None |
不使用任何方法包含Cookie(不提倡) |
Encryption |
使用Des或者三层Des对Cookie进行加密,但是并不对Cookie传输中是否被监听或篡改进行监视。 |
Validation |
监视Cookie,保证传输过程中不会被监听或者篡改。但是并不对Cookie进行加密。(发给谁,就只能又谁发回) |
All |
同时使用Encryption和Validation。(提倡) |
Web.config部分:
<authentication mode="Forms">
<forms name=".ASPXUSERDEMO" loginUrl="Default2.aspx" protection="All" timeout="60" path = "/"/>
</authentication>
<authorization>
<deny users="?" />
</authorization>
Default2部分:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<%@ Import Namespace="System.Web.Security " %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<script language="C#" runat="server">
protected void Login_Click(object sender, EventArgs e)
{
//authenticate user: this samples accepts only one user with
// a name of qimu and a password of '123'
if (UserEmail.Value == "qimu" && UserPass.Value == "123")
{
FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked);
}
else
{
Msg.Text = "用户名密码错误,请重新尝试";
}
}
</script>
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form3" runat="server">
<div>
<span style="font-family: Verdana">登陆页</span><table style="font-family: Verdana">
<tr>
<td>
Email:</td>
<td>
<input id="UserEmail" runat="server" type="text" /></td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="UserEmail"
Display="Static" ErrorMessage="*"></asp:RequiredFieldValidator></td>
</tr>
<tr style="color: #000000">
<td>
Password:</td>
<td>
<input id="UserPass" runat="server" type="password" /></td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="UserPass"
Display="Static" ErrorMessage="*"></asp:RequiredFieldValidator></td>
</tr>
<tr style="color: #000000">
<td>
记住 Cookie:</td>
<td>
<asp:CheckBox ID="PersistCookie" runat="server" />
</td>
<td>
</td>
</tr>
</table>
<asp:Button ID="Button1" runat="server" OnClick="Login_Click" Text="登陆" />
<p>
<asp:Label ID="Msg" runat="server" ForeColor="red"></asp:Label>
</p>
</div>
</form>
</body>
</html>
Default3.aspx.cs部分:
protected void Page_Load(object sender, EventArgs e)
{
Welcome.Text = "Hello, " + User.Identity.Name;
}
Default2部分:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>
<!DOCTYPE html