在开发过程中,我们需要做的事情包括:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
1. 在 web.config 中设置 Forms 身份验证相关参数。
2. 创建登录页。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
登录页中的操作包括:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
1. 验证用户名和密码是否正确。
2. 创建身份验证票证对象。
3. 将身份验证票证对象加密成字符串,写入 Cookies。
4. 重定向到原始请求 URL。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
1. 简单演示
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true"/>
<authentication mode="Forms">
<forms loginUrl="~/logon.aspx" name="MyAuthForm">
<credentials passwordFormat="Clear">
<user name="username" password="password"/>
</credentials>
</forms>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
logon.aspx
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<script runat="server">
protected void Button1_Click(object sender, EventArgs e)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
if (FormsAuthentication.Authenticate(this.txtUsername.Text, this.txtPassword.Text))
FormsAuthentication.RedirectFromLoginPage(this.txtUsername.Text, true);
else
Response.Write("用户名或密码错误!");
}
</script>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>登录页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
Username: <asp:TextBox ID="txtUsername" runat="server" Width="100px" Text="username"></asp:TextBox><br />
Password: <asp:TextBox ID="txtPassword" runat="server" Width="100px" Text="password"></asp:TextBox><br />
<asp:Button ID="Button1" runat="server" Text="Sign In" OnClick="Button1_Click" />
</div>
</form>
</body>
</html>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2. Forms 验证参数
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
如果只是某些子目录中的页面访问请求需要进行身份验证,那么可以修改一下根路径下的 web.config。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true"/>
<authentication mode="Forms">
<forms loginUrl="~/logon.aspx" name="MyAuthForm">
<credentials passwordFormat="Clear">
<user name="username" password="password"/>
</credentials>
</forms>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</configuration>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
然后在需要进行身份验证的子目录中创建一个新的 web.config。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
我们还可以在根路径下的 web.config 中指定相关参数来控制身份验证模式。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
cookieless
定义是否使用 Cookie 以及 Cookie 的行为。
.UseCookies
指定无论在什么设备上都始终使用 Cookie。
.UseUri
指定从不使用 Cookie。
.AutoDetect
如果设备配置文件支持 Cookie,则指定使用 Cookie;否则不使用 Cookie。
.UseDeviceProfile
如果浏览器支持 Cookie,则指定使用 Cookie;否则不使用 Cookie。
对于支持 Cookie 的设备,不尝试通过探测来确定是否已启用 Cookie 支持。
defaultUrl
定义在身份验证之后用于重定向的默认 URL。 默认值为 "default.aspx"。
当我们直接打开登录页进行登录后,该属性就很重要了。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
loginUrl
指定如果找不到任何有效的身份验证 Cookie,将请求重定向到的用于登录的 URL。默认值为 login.aspx。
name
指定要用于身份验证的 HTTP Cookie。如果正在一台服务器上运行多个应用程序并且每个应用程序都需要
唯一的 Cookie,则必须在每个应用程序的 Web.config 文件中配置 Cookie 名称。默认值为 ".ASPXAUTH"。
path
为应用程序发出的 Cookie 指定路径。
默认值是斜杠 (/),这是因为大多数浏览器是区分大小写的,如果路径大小写不匹配,浏览器不会送回 Cookie。
timeout
指定 Cookie 过期前逝去的时间(以整数分钟为单位)。持久性 Cookie 不超时。默认值为 "30"(30 分钟)。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
更详细信息,请参考 MSDN 文档。
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/dv_ASPNETgenref/html/8163b8b5-ea6c-46c8-b5a9-c4c3de31c0b3.htm
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true"/>
<authentication mode="Forms">
<forms loginUrl="~/logon.aspx" name="MyForm" defaultUrl="index.aspx" timeout="10">
<credentials passwordFormat="Clear">
<user name="username" password="password"/>
</credentials>
</forms>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</configuration>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3. 验证方法
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
我们可以使用下面 4 种方法中的一种进行票证写入和重定向操作,其实前 3 种只不过是对第 4 种方法的封装而已。推荐使用 1、4。注意后三种方法不支持cookieless="UseUri"。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// 1. 使用缺省身份验证票证
FormsAuthentication.RedirectFromLoginPage("username", true);
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// 2. 使用缺省身份验证票证
FormsAuthentication.SetAuthCookie("username", false);
Response.Redirect(FormsAuthentication.GetRedirectUrl("username", false));
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// 3. 使用缺省身份验证票证
Response.Cookies.Add(FormsAuthentication.GetAuthCookie("username", false));
Response.Redirect(FormsAuthentication.GetRedirectUrl("username", false));
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// 4. 使用自定义身份验证票证
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "username", DateTime.Now, DateTime.Now.AddMinutes(10), false, null);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket)));
Response.Redirect(FormsAuthentication.GetRedirectUrl("username", false));
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4. 自定义身份标识类型
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
MSDN 文档告诉我们,可以在 Global.asax 中通过 Authenticate 事件使用自定义 Principal、Identity 替代 GenericPrincipal、FormsIdentity。因为 Authenticate 事件在 AuthenticateRequest 事件期间引发,因此我们可以在其他模块之前创建用户身份标识对象(FormsAuthenticationEventArgs.User)。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref12/html/T_System_Web_Security_FormsAuthenticationEventHandler.htm
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
class MyPrincipal : System.Security.Principal.IPrincipal
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
// ![](https://www.cnblogs.com/Images/dot.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
class MyIdentity : System.Security.Principal.IIdentity
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
// ![](https://www.cnblogs.com/Images/dot.gif)
}
public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
if (FormsAuthentication.CookiesSupported)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
try
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(
Request.Cookies[FormsAuthentication.FormsCookieName].Value);
args.User = new MyPrincipal(new MyIdentity (ticket), new string[0]);
}
catch (Exception e)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// Decrypt method failed.
}
}
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw new HttpException("Cookieless Forms Authentication is not " +
"supported for this application.");
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
当然,还有另外一种简便的方法。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
if (!(HttpContext.Current.User is MyPrincipal))
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
HttpContext.Current.User = new MyPrincipal(new MyIdentity(ticket), roles);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
只不过,你要找一个合适的时机而已。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5. FormsAuthentication
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Authenticate
对照存储在应用程序配置文件中的凭据来验证用户名和密码。该方法只能验证存储在 web.config 中的用户名和密码信息,大多数时候我们会用自己的验证方法替代它。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Decrypt
解密从 Cookie 中获取的加密字符串,创建 FormsAuthenticationTicket 对象。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Encrypt
加密 FormsAuthenticationTicket,返回加密后字符串。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
GetRedirectUrl
返回导致重定向到登录页的原始请求 URL。GetRedirectUrl 方法返回查询字符串中使用 ReturnURL 变量名指定的 URL。例如,在 URL http://www.contoso.com/login.aspx?ReturnUrl=caller.aspx 中,GetRedirectUrl 方法返回返回 caller.aspx。如果 ReturnURL 变量不存在,GetRedirectUrl 方法将返回 DefaultUrl 属性中的 URL。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
RedirectFromLoginPage
将经过身份验证的用户重定向回最初请求的 URL 或 DefaultUrl 。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
RedirectToLoginPage
将浏览器重定向到登录 URL。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
RenewTicketIfOld
有条件地更新 FormsAuthenticationTicket 的发出日期和时间以及过期日期和时间。 注意该方法只是返回更新后的 FormsAuthenticationTicket 对象,并不会写入 Cookies。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
GetAuthCookie
为给定的用户名创建身份验证 Cookie,并不添加到响应的 Cookie 集合或 URL。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SetAuthCookie
为提供的用户名创建一个身份验证票证,并将其添加到响应的 Cookie 集合或 URL。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SignOut
从浏览器删除 Forms 身份验证票证。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6. 票证自定义数据应用
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
使用自定义票证时,我们可以添加一个 userData 参数。善加利用这个参数还是能带了一些意想不到的好处的,诸如存储用户 VIP 等级编号,所拥有的权限/角色集合等。当然 Cookie 和 URL 参数长度有限,这个自定义数据不能太长。
posted @
2008-06-11 22:38
wenanry
阅读(
318)
评论()
编辑
收藏
举报