第七章
身份验证、授权和登录
课程目标
q 身份验证
q Windows集成认证
q Forms验证
q 身份授权
体验项目——<用户注册及登录 >
实现了用户的注册、登录、修改用户密码等功能。
身份验证和授权的需求
qASP.NET 2.0 的成员和角色管理简化了用户管理的功能,用户的管理和验证只与提供者打交道,而不需要关注数据库本身的细节。
q现在 ASP.NET 2.0 包含对成员资格(用户名/密码凭据存储)和角色管理服务开箱即用的内置支持。由于所有这些服务都是提供程序驱动的,因此可以方便地交换出再用开发人员自己的自定义实现替换。
身份验证概念
q 身份验证(authentication)是一个标识应用程序客户端的过程,这里的客户端可能包括终端用户、服务、进程或计算机,通过了身份验证的客户端被称为主体(principal)。
q 身份验证可以跨越应用程序的多个层发生。终端用户起初由Web应用程序进行身份验证,通常根据用户名和密码进行;随后终端用户的请求由中间层应用程序服务器和数据库服务器进行处理,这这个过程中也将进行身份验证以便验证并处理这些请求。
ASP.NET身份验证模式
q 与Microsoft Internet信息服务(IIS)一起使用的ASP.NET可以使用以下任意一种身份验证方式来验证用户凭据(如用户名和密码):
l Windows:基本、摘要式或集成Windows身份验证(NTLM或Kerberos)。
l Forms身份验证,可以通过该身份验证在应用程序中创建登录页并管理身份验证。
l Microsoft Passport身份验证。
l None。
基于Windows的身份验证
q如果应用程序使用Active Directory用户存储,则应该使用集成的Windows身份验证。
q对ASP.NET应用程序使用集成Windows身份验证时,最好的方法是使用ASP.NET的Windows身份验证提供程序附带的Internet信息服务(IIS)身份验证方法。
基于Windows的身份验证
q 如ASP.NET针对Windows身份验证进行配置,具体启用配置参见以下代码:
<configuration>
<system.web>
<authentication mode="Windows" />
</system.web>
</configuration>
q ASP.NET依靠IIS,利用配置好的身份验证模式对其客户端进行身份验证。IIS通过检查特定应用程序的原数据库设置来确定其身份验证模式。
q 集成Windows身份验证最适合于Intranet环境,其中的客户端计算机和Web服务器计算机都是相同(即信任的)域的一部分。
基于Windows的身份验证示例
(1)创建一个基于Http类型的网站。
(2)添加一个“添加新项…”按钮,添加一个Web配置Web.Config文件。
(3)在Web.Config中设置验证方式为Windows:
<system.web>
<authentication mode="Windows" />
</system.web>
(4)添加一个Web窗体页,在Page_Load事件中输入以下代码:
(5)在运行本例子之前,需要在IIS的“目录安全性”选项卡中禁止匿名访问,启用“Windows集成身份验证”。具体设置,在IIS中选择当前项目应用程序的虚拟文件夹,右键选择“属性”。在“属性”对话框中,选择“目录安全性”,如图所示。
(6)点击匿名访问和身份验证控制中的“编辑”,弹出“身份验证方法”对话框,如图所示。
(7)在图中去掉“匿名访问”选项,选中“集成Windows身份验证”。
(8)当用户以http://127.0.0.1/WindowsAuthSite/WindowsAuthLogin.aspx 访问时,会提示用户输入用户名和密码,ASP.NET应用程序会以指定的帐号身份运行
基于窗体的身份验证
q 基于窗体的身份验证是一项ASP.NET身份验证服务,它使应用程序能够提供自己的登录用户界面并进行自己的凭据验证。ASP.NET对用户进行身份验证,将未经身份验证的用户重定向到登录页,并执行所有必要的Cookie管理。
q 应用程序必须配置为使用基于窗体的身份验证,方法是将<authentication>设置为Forms,并拒绝匿名用户访问。
q 下面的示例演示如何在所需应用程序的Web.config文件中完成此操作:
<configuration>
<system.web>
<authentication mode="Forms"/>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</configuration>
<authentication>元素
q 基于窗体的身份验证来配置要使用的Cookie的名称、保护类型、用于登录页的URL、Cookie有效的时间长度,以及用于已发出的Cookie路径。
q 下表显示<Forms>元素的有效属性,该元素是下面示例中显示<authentication>元素的子元素:
<authentication mode="Forms">
<forms name=".ASPXCOOKIEDEMO" loginUrl="login.aspx"
defaultUrl="default.aspx"
protection="All" timeout="30" path="/" requireSSL="false"
slidingExpiration="true" enableCrossAppRedirects="false"
cookieless="UseDeviceProfile" domain="">
<!-- protection="[All|None|Encryption|Validation]" -->
<!-- cookieless="[UseUri | UseCookies | AutoDetect | UseDeviceProfile]" -->
</forms>
</authentication>
<authentication>元素
Forms验证示例
q 在Web.Config配置了应用程序后,配置见下面代码,需要提供一个登录页。比如在示例中添加一个简单的登录页。该示例在运行时需要Default.aspx页。未经身份验证的请求被重定向到登录页(Login.aspx),该页显示一个简单窗体,提示用户输入电子邮件地址和密码。(使用Username="it@tsinghua.edu.cn"和Password="tsinghuait"作为凭据。)
<configuration>
<system.web>
<authentication mode="Forms">
<forms name=".ASPXUSERDEMO"
loginUrl="login.aspx" protection="All"
timeout="60" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
<globalization requestEncoding="UTF-8" responseEncoding="UTF-8" />
</system.web>
</configuration>
q 验证了凭据后,应用程序调用以下内容(userEmail是TextBox控件,PersistCookie是CheckBox控件):
FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked)
Forms身份验证的不同情况处理
q 第一种情况,整个站点都需要登录才能访问,但需要有注册页面,实现方法如下。
(1)在应用程序根目录下的配置文件Web.Config中的配置为:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<compilation debug="false" />
<authentication mode="Forms" />
<authorization>
<deny users="?"/>
</authorization>
</system.web>
<location path="register" allowOverride="true">
<system.web>
<authorization>
<allow users="?"/>
</authorization>
</system.web>
</location>
</configuration>
(2)在根目录下创建了Login.aspx,为了便于查看,采用图文结合模式 。
(3)以上情况在做后台管理程序时也是可以使用的 。
Forms身份验证的不同情况处理
q 第二种情况,有权限的页面和没有权限的页面混合在一起,在此情况下,需要去掉配置文件中拒绝节。
(1)具体内容如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<compilation debug="false" />
<authentication mode="Forms" />
</system.web>
<location path="register" allowOverride="true">
<system.web>
<authorization>
<allow users="?"/>
</authorization>
</system.web>
</location>
</configuration>
(2)然后,每个需要验证的页面都需要开发人员自己进行判断是否通过验证,其部分代码如下:
protected void Page_Load(object sender, EventArgs e)
{
if (HttpContext.Current.User.Identity.Name == "")
{
Response.Redirect(Request.ApplicationPath +
"/login.aspx?url=" + Request.Url.ToString());
}
}
Forms身份验证的不同情况处理
q 第三种情况,不同的目录使用不同的登录页面。
(1)先设置Web.Config内容,设置每个子文件或者目录的配置信息,具体可参见一下:
(2)接着,创建不同用户的登录页面“CommonUserLogin.aspx”和“AdminUserLogin.aspx”,页面上包含登录用表单。
(3)然后,创建不同用户可以访问的目录“CommonUser”和“AdminUser”。
(4)最后,在Login.aspx页面中,对转过来的地址进行判断,判断其来路,然后再进行转向到不同的登录文件。
protected void Page_Load(object sender, EventArgs e)
{
string comeFromUrl = "";
if (Request.QueryString["url"] != null)
{
//下面这个过程是分解所在的目录,这里可以根据实际情况看是否处理。
comeFromUrl = Request.QueryString["url"];
comeFromUrl = comeFromUrl.Remove(0, Request.ApplicationPath.Length + 1);
comeFromUrl = comeFromUrl.Substring(0, comeFromUrl.IndexOf("/",0));
Response.Redirect(comeFromUrl + "login.aspx?url" + Request.QueryString.ToString());
}
}
q Forms身份验证所使用的Cookie由System.Web.Security.FormsAuthenticationTicket类的序列化版本组成。信息包括用户名(但没有密码)、使用的Forms身份验证版本、发出Cookie的日期以及可选的应用程序特定数据的字段。
q 通过使用FormsAuthentication.SignOut方法,应用程序代码可以撤消或移除身份验证Cookie。这将移除身份验证Cookie,不论它是临时的还是永久的。
在验证凭证中存储自定义信息
在Forms身份验证的票证中可以UserData属性中存储自定义信息,但是,这些信息必须确保UserData属性的大小不会导致Cookie或过长。
if ((userName.Text.Trim() == "tsinghuait") && (userPwd.Text.Trim() == "study"))
{
FormsAuthentication.RedirectFromLoginPage(userName.Text, chkPersist.Checked);
HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName.Text, chkPersist.Checked);
FormsAuthenticationTicket FormAt = FormsAuthentication.Decrypt(cookie.Value);
//创建自定义数据
string userData = "id=5|title=zhangfei|time=" + System.Datatime.Now.Second;
FormsAuthenticationTicket newFromAt = new
FormsAuthenticationTicket(FormAt.Version,FormAt.Name,FormAt.IssueDate,
FormAt.Expiration,FormAt.IsPersistent,userData);
string encryptValue = FormsAuthentication.Encrypt(newFromAt);
cookie.Value = encryptValue;
Response.Cookies.Add(cookie);
}
else
{
msg.Text = "用户名或密码错误,请重新输入。";
}
授权用户和角色
qASP.NET用于控制对URL资源的客户端访问。它对于生成请求的HTTP方法(GET或POST)是可配置的,并且可配置为允许或拒绝访问用户组或角色组。
q下面的示例演示向名为someone的用户和名为Admins的角色授予访问权。所有其他用户的访问被拒绝。
<authorization>
<allow users="it@tsinghua.edu.cn" />
<allow roles="Admins" />
<deny users="*" />
</authorization>
q允许的授权指令元素为allow或deny。每个allow或deny元素都必须包含users或roles属性。通过提供一个逗号分配的列表,可在单个元素中指定多个用户或角色。
<allow users="John,Mary" />
有两个特殊的用户名,见表
实践项目——<用户注册及登录 >
程序的实现要求如下:
(1)创建新站点。
(2)设置站点按照Forms验证方式,用户名和密码保存在数据库中。
(3)实现用户注册、密码修改、修改密码、密码找回等操作
本章总结
q 身份验证
q Windows集成认证
q Forms身份验证
q 身份授权