asp.net基于窗体的身份验证
基于窗体的身份验证
//登陆页面
protected void Button1_Click(object sender, EventArgs e)
{
string username = "tsuser";
string userpwd = "resust";
string roles = "Adminstrator";
//生成验证票据对象.
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1,
username,
DateTime.Now, DateTime.Now.AddMinutes(1),
false,
roles);
//加密验证票
string encrytedTicket = FormsAuthentication.Encrypt(authTicket);
//生成Cookie对象.
//FormsAuthentication.FormsCookieName取得WebConfig中<Authentication>
//配置节中Name的值作为Cookie的名字.
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName,
encrytedTicket);
Response.Cookies.Add(authCookie);
//跳转到用户的初试请求页.
string ddd = FormsAuthentication.GetRedirectUrl(username, false);
Response.Redirect( "WebForm1.aspx" );
//Server.Transfer("WebForm1.aspx");
}
//Global.asax中《加上using System.Security.Principal;命名空间》
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
//获取用户的角色。
string cookieName = FormsAuthentication.FormsCookieName;//从验证票据获取Cookie的名字。
//取得Cookie.
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if (null == authCookie)
{
return;
}
FormsAuthenticationTicket authTicket = null;
//获取验证票据。
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (null == authTicket)
{
return;
}
//验证票据的UserData中存放的是用户角色信息。
//UserData本来存放用户自定义信息。此处用来存放用户角色。
string[] roles = authTicket.UserData.Split(new char[] { ',' });
FormsIdentity id = new FormsIdentity(authTicket);
GenericPrincipal principal = new GenericPrincipal(id, roles);
//把生成的验证票信息和角色信息赋给当前用户.
Context.User = principal;
}
//不通过验证直接进入主页,会返回到default.aspx页面*/
//也可以在新页面中判断
if ( !HttpContext.Current.User.IsInRole("Adminstrator") )
{
Response.Redirect("Default.aspx");
}
/*//web.config中添加
<authentication mode="Forms">
<forms name="MYWEBAPP.ASPXAUTH"
loginUrl="default.aspx"
protection="All"
path="/"/>
</authentication>
<!-- 设置对本地目录的访问。如果验证票据未通过,则无法访问
-->
<authorization>
<!-- Order and case are important below -->
<allow roles="Adminstrator"/>
<deny users="*"/>
</authorization>
基于窗体的身份验证是一项 ASP.NET 身份验证服务,它使应用程序能够提供自己的登录用户界面并进行自己的凭据验证。ASP.NET 对用户进行身份验证,将未经身份验证的用户重定向到登录页,并执行所有必要的 Cookie 管理。这种身份验证是许多网站使用的流行方法。
应用程序必须配置为使用基于窗体的身份验证,方法是将 <authentication> 设置为 Forms,并拒绝匿名用户访问。下面的示例演示如何在所需应用程序的 Web.config 文件中完成此操作:
<configuration> <system.web> <authentication mode="Forms"/> <authorization> <deny users="?" /> </authorization> </system.web> </configuration>管理员使用基于窗体的身份验证来配置要使用的 Cookie 的名称、保护类型、用于登录页的 URL、Cookie 有效的时间长度,以及用于已发出的 Cookie 的路径。下表显示 <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>
属性 | 说明 |
---|---|
cookieless | ASP.NET 2.0 Forms 身份验证可以将 Forms 身份验证票存储在 Cookie 中也可以以无 Cookie 的表示形式存储在 URL 上。UseDeviceProfile 的默认值表示 ASP.NET 根据预先计算得到的浏览器配置文件来确定存储票证的位置。AutoDetect 选项使 ASP.NET 动态确定浏览器是否支持 Cookie。UseUri 和 UseCookies 分别强制实施无 Cookie 票证和有 Cookie 票证。 |
defaultUrl | 指定在成功登录后,请求将重定向到的默认 URL。在登录后进行重定向时,如果重定向 URL 对于 Forms 身份验证不可用,则使用此值。 |
domain | 指定包含 Forms 身份验证票的 HttpCookie 的 Domain 属性的值。显式设置此属性可使应用程序共享同一个 Cookie,前提是这些应用程序共享某个 DNS 命名空间的一个公共部分(例如,如果 domain 属性设置为“contoso.com”,则 appA.contoso.com 和 appB.contoso.com 可以共享一个 Cookie)。 |
enableCrossAppRedirects | 在 ASP.NET 2.0 中,Forms 身份验证允许以查询字符串变量或窗体 POST 变量的形式在应用程序之间传递 Forms 身份验证票。将此属性设置为 true 可使 FormsAuthenticationModule 能够从查询字符串或窗体 POST 变量提取票证。 |
loginUrl | 指定未经身份验证的用户的请求将被重定向到的 URL。该 URL 可以在同一台计算机上或在远程计算机上。如果是在远程计算机上,则两台计算机上 machineKey 配置元素中的 decryptionkey 和 validationKey 属性都需要使用相同的值。 |
name | 用于身份验证的 HTTP Cookie 的名称。注意,如果多个应用程序需要在一台计算机上使用基于窗体的身份验证服务,并且每个应用程序都希望由应用程序隔离 Forms 身份验证 Cookie,则每个应用程序都应配置一个唯一的 Cookie 值。为避免在 URL 中产生依赖项,在设置身份验证 Cookie 时,ASP.NET 还使用“/”作为 Path 值,以便将这些 Cookie 发送回站点上的每个应用程序。 |
path | 用于发出的 Cookie 的路径。默认值为“/”,以避免路径中大小写不匹配的造成的困难,因为在返回 Cookie 时,浏览器是严格区分大小写的。共享服务器环境中的应用程序应使用此指令来维护专用 Cookie。(它们还可以使用 API 在运行时指定路径来发出 Cookie。) |
protection | 用于保护 Cookie 数据的方法。有效值如下:
|
requireSSL | 如果设置为 true,则 Forms 身份验证会设置 Forms 身份验证 Cookie 的安全位。兼容的浏览器只将 Cookie 通过 SSL 连接发送回 ASP.NET。注意,如果使用无 Cookie Forms 身份验证,则此设置无效。 |
slidingExpiration | 如果设置为 true,则 Forms 身份验证将定期更新 Forms 身份验证票的生存期。无论票证是包含在 Cookie 中,还是以无 Cookie 的格式包含在 URL 中,都会进行此操作。 |
timeout | 时间量(以整数分钟为单位),经过该时间量之后,Cookie 则会过期。默认值是 30。超时属性是一个可调值,从收到上次请求的时间开始计算,它将在 n 分钟后过期。为了避免对性能产生负面影响,也为了避免那些打开了 Cookie 警告的应用程序产生多个浏览器警告,Cookie 在超时时间过半时更新。(这意味着在某些情况下可能会出现精度损失。) |
配置了应用程序后,需要提供一个登录页。下面的示例演示一个简单的登录页。该示例在运行时需要 Default.aspx 页。未经身份验证的请求被重定向到登录页 (Login.aspx),该页显示一个简单窗体,提示用户输入电子邮件地址和密码。(使用 Username="someone@www.contoso.com" 和 Password="password" 作为凭据。)
验证了凭据后,应用程序调用以下内容:
C# | VB | |
FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked); |
这将用户重定向回最初请求的 URL。不想执行重定向的应用程序既可以调用 FormsAuthentication.GetAuthCookie 来检索 Cookie 值,也可以调用 FormsAuthentication.SetAuthCookie 将正确加密的 Cookie 附加到输出的响应中。对于提供嵌入在包含页中的登录用户界面的应用程序,或者想要更多地控制用户被重定向到的位置的应用程序而言,这些方法很有用。
身份验证 Cookie 既可以是临时的,也可以是永久(“持久”)的。临时 Cookie 只在当前浏览器会话期间保持。当浏览器关闭时,Cookie 即会丢失。永久 Cookie 由浏览器保存,并在浏览器各会话期间发回,除非用户显式删除 Cookie 或 Cookie 的生存期结束。临时 Cookie 和永久 Cookie 的 Cookie 生存期由
timeout
配置属性确定。这一点在行为上与 ASP.NET 的早期版本相比稍有更改,在早期版本中永久 Cookie 的生存期为 50 年。在 ASP.NET 2.0 中,临时 Cookie 和永久 Cookie 的过期日期设置为当前时间加上 timeout
配置属性的值。 Forms 身份验证所使用的身份验证 Cookie 由 System.Web.Security.FormsAuthenticationTicket 类的序列化版本组成。信息包括用户名(但没有密码)、使用的 Forms 身份验证版本、发出 Cookie 的日期以及可选的应用程序特定数据的字段。
通过使用 FormsAuthentication.SignOut 方法,应用程序代码可以撤消或移除身份验证 Cookie。这将移除身份验证 Cookie,不论它是临时的还是永久的。
还可以使用配置为基于窗体的身份验证服务提供有效凭据的列表,如下例所示:
<authentication> <credentials passwordFormat="SHA1" > <user name="Mary" password="94F85995C7492EEC546C321821AA4BECA9A3E2B1"/> <user name="John" password="5753A498F025464D72E088A9D5D6E872592D5F91"/> </credentials> </authentication>还可以通过使用
FormsAuthentication.HashPasswordForStoringInConfigFile(String password, String passwordFormat)
API 生成密码的哈希表示形式。此方法支持使用 SHA1 或 MD5 生成哈希值。然后,应用程序可以调用 FormsAuthentication.Authenticate 并提供用户名和密码,ASP.NET 将验证凭据。根据 passwordFormat 属性的下列值,凭据可以存储在明文中,也可以存储为 SHA1 或 MD5: Hash 类型 | 说明 |
---|---|
Clear | 密码以明文形式存储 |
SHA1 | 密码存储为 SHA1 摘要 |
MD5 | 密码存储为 MD5 摘要 |