本文收集自----MSDN
一:Forms 身份验证流程
在 Forms 身份验证方案中,应用程序直接从用户那里收集名字和密码等凭据,并自己判断这些信息的真实性。应用程序不使用 IIS 身份验证,但 IIS 身份验证设置可以影响 Forms 身份验证。作为一项原则,当您使用 Forms 身份验证时,请在 IIS 中启用匿名访问。否则,如果用户未通过 IIS 身份验证,他们甚至无法访问应用程序以便向 Forms 身份验证提供用户名和密码。
此方案中的数据流如下图所示。
Forms 身份验证
此图说明下面的事件序列:
-
用户生成对受保护资源的请求。
-
IIS 接收请求,并且由于已启用 IIS 匿名访问,IIS 不执行任何用户身份验证,而将请求传递给 ASP.NET 应用程序。
-
由于 ASP.NET 身份验证模式设置为 Forms,ASP.NET 应用程序将检查 Forms 身份验证票的请求(特定 Cookie)。如果没有连接到请求的身份验证票,则 ASP.NET 将请求重定向到应用程序的配置文件中指定的登录页。
-
用户在登录页上输入所需凭据(通常为用户名和密码)。应用程序代码检查凭据以确认它们的真实性。如果凭据通过身份验证,应用程序代码将身份验证票连接到表示用户凭据的响应。(不包括密码)。如果身份验证失败,通常将响应连同“访问被拒绝”消息一起返回,或重新显示登录窗体。
发出的身份验证票包括在对 ASP.NET 应用程序的后续请求中。ASP.NET 使用消息身份验证检查 (MAC) 来检查身份验证票的有效性。
-
如果用户通过身份验证,ASP.NET 检查身份验证并允许对初始请求的资源的访问、将请求重定向到某个其他页或将请求重定向到自定义授权模块(其中将测试要访问受保护的资源的凭据是否已得到授权)。如果授权失败,则 ASP.NET 将用户重定向到登录页。
如果用户已被授权,则将允许用户访问受保护资源,或者应用程序会在授权访问受保护资源之前要求额外进行凭据测试,具体取决于应用程序的设计。
二:Form身份验证控制流
ASP.NET Forms 身份验证的控制流如下表所示。
浏览器和 HTTP 操作 | 服务器答复 | ||
---|---|---|---|
从服务器请求受保护的资源。HTTP 操作为: GET /default.aspx |
如果不存在身份验证 Cookie,则将请求重定向到登录页以收集凭据。使用 RETURNURL 作为关键字,将有关起始页的信息放在查询字符串中。服务器 HTTP 答复为: 302 Found Location: http://samples.microsoft.com/logon.aspx?RETURNURL=/default.aspx |
||
重定向到登录页。HTTP 操作为: GET /logon.aspx?RETURNURL=/default.aspx |
返回登录页。为安全起见,建议对登录页使用安全套接字层 (SSL),以阻止用户凭据以明文形式发送。服务器 HTTP 答复为: 200 OK |
||
用户在登录页输入凭据后,提交该页。HTTP 操作为: POST /logon.aspx?RETURNURL=/default.aspx |
验证用户凭据,如果凭据通过身份验证,则将浏览器重定向到在 QueryString 中作为 RETURNURL 变量指定的原始 URL。默认情况下,身份验证票证以 Cookie 的形式发出。
服务器 HTTP 答复为: 302 Found Location: /default.aspx |
||
遵循重定向操作并再次请求原始资源。HTTP 操作为: GET /default.aspx |
如果用户通过身份验证,则允许访问并授予身份验证 Cookie,该 Cookie 中包含身份验证票证。同一浏览器会话的以后的请求将在模块检查该 Cookie 时进行身份验证。可以创建可用于以后的会话的持久性 Cookie,但该 Cookie 的使用期截止到到期日期为止。服务器 HTTP 答复为: 200 OK Set-Cookie: ASPXTICKET=ABCDEFG12345;Path=/ 注意,Cookie 路径设置为 /。由于 Cookie 名称区分大小写,因此这有助于防止站点中的 URL 的大小写不一致。例如,如果路径设置为 /SavingsPlan,而链接包含 /savingsplan,由于浏览器不会发送 Cookie,用户将*重新进行身份验证。 |
三:Form身份验证的简单实现
本主题中的示例演示了 ASP.NET Forms 身份验证的简单实现。该示例旨在阐释关于如何使用 Forms 身份验证来允许用户登录到 ASP.NET 应用程序的基础知识。
注意 |
---|
一种使用 Forms 身份验证的方便途径是使用 ASP.NET 成员资格和 ASP.NET 登录控件。ASP.NET 成员资格提供了存储和管理用户信息的方式,并包含对用户进行身份验证的方法。ASP.NET 登录控件使用 ASP.NET 成员资格,并封装提示用户输入凭据、验证用户、恢复或替换密码等操作所需的逻辑。实际上,ASP.NET 成员资格和 ASP.NET 登录控件在 Forms 身份验证之上提供了一个抽象层,从而取代了要使用 Forms 身份验证通常必须完成的大部分甚至所有工作。有关更多信息,请参见使用成员资格管理用户和 ASP.NET 登录控件概述。 |
在该示例的方案中,用户请求一个受保护的资源,即名为 Default.aspx 的页。只有一个用户可以访问此受保护的资源:jchen@contoso.com,其密码为“37Yj*99P”。该用户名和密码已硬编码到 Logon.aspx 文件中。该示例需要三个文件:Web.config 文件、名为 Logon.aspx 的页以及名为 Default.aspx 的页。这些文件位于应用程序根目录中。
配置应用程序使用 Forms 身份验证
-
如果应用程序的根目录中有 Web.config 文件,请打开该文件。
-
如果应用程序的根文件夹中没有 Web.config 文件,请创建一个名为 Web.config 的文本文件,并在其中添加下列元素:
<?xml version="1.0"?> <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <system.web> </system.web> </configuration>
-
在 system.web 元素中,创建一个 authentication 元素,并将它的 mode 属性设置为 Forms,如下面的示例所示:
<system.web> <authentication mode="Forms"> </authentication> </system.web>
-
在 authentication 元素中,创建一个 forms 元素,并设置下列属性:
-
loginUrl 设置为“Logon.aspx”。Logon.aspx 是 ASP.NET 在找不到包含请求内容的身份验证 Cookie 的情况下进行重定向时所使用的 URL。
-
name 设置为“.ASPXFORMSAUTH”。这是为包含身份验证票证的 Cookie 的名称设置的后缀。
<system.web> <authentication mode="Forms"> <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH"> </forms> </authentication> </system.web>
-
-
在 system.web 元素中,创建一个 authorization 元素。
<system.web> <authentication mode="Forms"> <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH"> </forms> </authentication> <authorization> </authorization> </system.web>
-
在 authorization 元素中,创建一个 deny 元素,并将其 users 属性设置为“?”。这是指定将拒绝未通过身份验证的用户(由“?”表示)访问该应用程序中的资源。
<system.web> <authentication mode="Forms"> <forms loginUrl="logon.aspx" name=".ASPXFORMSAUTH"> </forms> </authentication> <authorization> <deny users="?" /> </authorization> </system.web>
-
保存并关闭 Web.config 文件。
创建登录页
当用户从网站请求任何页时,如果他们此前未通过身份验证,将被重定向到名为 Logon.aspx 的页。您之前在 Web.config 文件中指定了该文件名。
Logon.aspx 页收集用户凭据(电子邮件地址和密码)并对它们进行身份验证。如果用户成功通过身份验证,登录页会将用户重定向到他们最初所请求的页。在本示例中,有效凭据被硬编码到页代码中。
安全注意 |
---|
该示例包含一个文本框,用于接受用户输入,这是一个潜在的安全威胁。默认情况下,ASP.NET 网页验证用户输入是否不包括脚本或 HTML 元素。有关更多信息,请参见脚本侵入概述。 |
创建登录页
-
在应用程序根文件夹中创建一个名为 Logon.aspx 的 ASP.NET 页。
-
将下面的标记和代码复制到该页中:
<%@ Page Language="C#" %> <%@ Import Namespace="System.Web.Security" %> <script runat="server"> void Logon_Click(object sender, EventArgs e) { if ((UserEmail.Text == "jchen@contoso.com") && (UserPass.Text == "37Yj*99Ps")) { FormsAuthentication.RedirectFromLoginPage (UserEmail.Text, Persist.Checked); } else { Msg.Text = "Invalid credentials. Please try again."; } } </script> <html> <head id="Head1" runat="server"> <title>Forms Authentication - Login</title> </head> <body> <form id="form1" runat="server"> <h3> Logon Page</h3> <table> <tr> <td> E-mail address:</td> <td> <asp:TextBox ID="UserEmail" runat="server" /></td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="UserEmail" Display="Dynamic" ErrorMessage="Cannot be empty." runat="server" /> </td> </tr> <tr> <td> Password:</td> <td> <asp:TextBox ID="UserPass" TextMode="Password" runat="server" /> </td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" ControlToValidate="UserPass" ErrorMessage="Cannot be empty." runat="server" /> </td> </tr> <tr> <td> Remember me?</td> <td> <asp:CheckBox ID="Persist" runat="server" /></td> </tr> </table> <asp:Button ID="Submit1" OnClick="Logon_Click" Text="Log On" runat="server" /> <p> <asp:Label ID="Msg" ForeColor="red" runat="server" /> </p> </form> </body> </html>
此页包含用于收集用户信息的 ASP.NET 服务器控件和一个复选框,当用户单击该复选框时,他们的登录凭据将保存下来。“登录”按钮的 Click 处理程序包含对照硬编码的值来检查用户的电子邮件地址和密码的代码。(该密码是强密码,包含各种非字母字符,且至少为八个字符长。)如果用户的凭据正确,代码将调用 FormsAuthentication 类的 RedirectFromLoginPage 方法,并传递用户名和一个来源于复选框的布尔值,该值指示是否将身份验证票证保存为 Cookie。此方法将用户重定向到最初所请求的页。如果用户的凭据不匹配,将显示一条错误消息。请注意,该页会导入包含 FormsAuthentication 类的 System.Web.Security 命名空间。
创建默认页
对于本示例,您将在应用程序根文件夹中创建一个 ASP.NET 页。因为您在配置文件中指定拒绝所有未通过身份验证的用户访问应用程序的 ASP.NET 资源(包括 .aspx 文件,但不包括静态文件,例如 HTML 文件或包括图像、音乐等在内的多媒体文件),所以当用户请求该页时,Forms 身份验证将检查用户的凭据,并在必要的时候将用户重定向到登录页。您创建的页还将允许用户注销,以清除他们的已保存身份验证票证 (Cookie)。
创建默认页
-
在应用程序根文件夹中创建一个名为 Default.aspx 的 ASP.NET 页。
-
将下面的标记和代码复制到该页中:
<%@ Page Language="C#" %> <html> <head> <title>Forms Authentication - Default Page</title> </head> <script runat="server"> void Page_Load(object sender, EventArgs e) { Welcome.Text = "Hello, " + Context.User.Identity.Name; } void Signout_Click(object sender, EventArgs e) { FormsAuthentication.SignOut(); Response.Redirect("Logon.aspx"); } </script> <body> <h3> Using Forms Authentication</h3> <asp:Label ID="Welcome" runat="server" /> <form id="Form1" runat="server"> <asp:Button ID="Submit1" OnClick="Signout_Click" Text="Sign Out" runat="server" /><p> </form> </body> </html>
此页显示用户的已通过身份验证的标识,该标识是由 FormsAuthentication 类设置的,并作为 Context.User.Identity.Name 属性在 ASP.NET 页中提供。“注销”按钮的 Click 处理程序包含具有如下作用的代码:调用 SignOut 方法以清除用户标识并移除身份验证票证 (Cookie)。然后将用户重定向到登录页。