[.NET 基于角色安全性验证] 之三:ASP.NET Forms 身份验证

转载 2008年10月01日 10:56:00
 在开发过程中,我们需要做的事情包括:

1. 在 web.config 中设置 Forms 身份验证相关参数。
2. 创建登录页。

登录页中的操作包括:

1. 验证用户名和密码是否正确。
2. 创建身份验证票证对象。
3. 将身份验证票证对象加密成字符串,写入 Cookies。
4. 重定向到原始请求 URL。

1. 简单演示

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>

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">

<script runat="server">
  protected void Button1_Click(object sender, EventArgs e)
  {
    if (FormsAuthentication.Authenticate(this.txtUsername.Text, this.txtPassword.Text))
      FormsAuthentication.RedirectFromLoginPage(this.txtUsername.Text, true);
    else
      Response.Write("用户名或密码错误!");
  }
</script>

<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>

2. Forms 验证参数

如果只是某些子目录中的页面访问请求需要进行身份验证,那么可以修改一下根路径下的 web.config。

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>

然后在需要进行身份验证的子目录中创建一个新的 web.config。
<?xml version="1.0"?>
<configuration>
  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
</configuration>

我们还可以在根路径下的 web.config 中指定相关参数来控制身份验证模式。
cookieless
  定义是否使用 Cookie 以及 Cookie 的行为。
  .UseCookies
    指定无论在什么设备上都始终使用 Cookie。
  .UseUri
    指定从不使用 Cookie。
  .AutoDetect
    如果设备配置文件支持 Cookie,则指定使用 Cookie;否则不使用 Cookie。
  .UseDeviceProfile
    如果浏览器支持 Cookie,则指定使用 Cookie;否则不使用 Cookie。
    对于支持 Cookie 的设备,不尝试通过探测来确定是否已启用 Cookie 支持。
 
defaultUrl
  定义在身份验证之后用于重定向的默认 URL。 默认值为 "default.aspx"。
  当我们直接打开登录页进行登录后,该属性就很重要了。

loginUrl
  指定如果找不到任何有效的身份验证 Cookie,将请求重定向到的用于登录的 URL。默认值为 login.aspx。
 
name
  指定要用于身份验证的 HTTP Cookie。如果正在一台服务器上运行多个应用程序并且每个应用程序都需要
  唯一的 Cookie,则必须在每个应用程序的 Web.config 文件中配置 Cookie 名称。默认值为 ".ASPXAUTH"。
 
path
  为应用程序发出的 Cookie 指定路径。
  默认值是斜杠 (/),这是因为大多数浏览器是区分大小写的,如果路径大小写不匹配,浏览器不会送回 Cookie。
 
timeout
  指定 Cookie 过期前逝去的时间(以整数分钟为单位)。持久性 Cookie 不超时。默认值为 "30"(30 分钟)。

更详细信息,请参考 MSDN 文档。
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/dv_ASPNETgenref/html/8163b8b5-ea6c-46c8-b5a9-c4c3de31c0b3.htm
<?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>

3. 验证方法

我们可以使用下面 4 种方法中的一种进行票证写入和重定向操作,其实前 3 种只不过是对第 4 种方法的封装而已。推荐使用 1、4。注意后三种方法不支持cookieless="UseUri"。
// 1. 使用缺省身份验证票证
FormsAuthentication.RedirectFromLoginPage("username", true);

// 2. 使用缺省身份验证票证
FormsAuthentication.SetAuthCookie("username", false);
Response.Redirect(FormsAuthentication.GetRedirectUrl("username", false));

// 3. 使用缺省身份验证票证
Response.Cookies.Add(FormsAuthentication.GetAuthCookie("username", false));
Response.Redirect(FormsAuthentication.GetRedirectUrl("username", false));

// 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));

4. 自定义身份标识类型

MSDN 文档告诉我们,可以在 Global.asax 中通过 Authenticate 事件使用自定义 Principal、Identity 替代 GenericPrincipal、FormsIdentity。因为 Authenticate 事件在 AuthenticateRequest 事件期间引发,因此我们可以在其他模块之前创建用户身份标识对象(FormsAuthenticationEventArgs.User)。

ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref12/html/T_System_Web_Security_FormsAuthenticationEventHandler.htm
class MyPrincipal : System.Security.Principal.IPrincipal
{
  // ...
}

class MyIdentity : System.Security.Principal.IIdentity
{
  // ...
}
  
public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
{
  if (FormsAuthentication.CookiesSupported)
  {
    if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
    {
      try
      {
        FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(
          Request.Cookies[FormsAuthentication.FormsCookieName].Value);
 
        args.User = new MyPrincipal(new MyIdentity (ticket), new string[0]);
      }
      catch (Exception e)
      {
        // Decrypt method failed.
      }
    }
  }
  else
  {
    throw new HttpException("Cookieless Forms Authentication is not " +
      "supported for this application.");
  }

}

当然,还有另外一种简便的方法。
if (!(HttpContext.Current.User is MyPrincipal))
{
  HttpContext.Current.User = new MyPrincipal(new MyIdentity(ticket), roles);
}

只不过,你要找一个合适的时机而已。

5. FormsAuthentication

Authenticate
对照存储在应用程序配置文件中的凭据来验证用户名和密码。该方法只能验证存储在 web.config 中的用户名和密码信息,大多数时候我们会用自己的验证方法替代它。

Decrypt
解密从 Cookie 中获取的加密字符串,创建 FormsAuthenticationTicket 对象。

Encrypt
加密 FormsAuthenticationTicket,返回加密后字符串。

GetRedirectUrl
返回导致重定向到登录页的原始请求 URL。GetRedirectUrl 方法返回查询字符串中使用 ReturnURL 变量名指定的 URL。例如,在 URL http://www.contoso.com/login.aspx?ReturnUrl=caller.aspx 中,GetRedirectUrl 方法返回返回 caller.aspx。如果 ReturnURL 变量不存在,GetRedirectUrl 方法将返回 DefaultUrl 属性中的 URL。

RedirectFromLoginPage
将经过身份验证的用户重定向回最初请求的 URL 或 DefaultUrl 。

RedirectToLoginPage
将浏览器重定向到登录 URL。

RenewTicketIfOld
有条件地更新 FormsAuthenticationTicket 的发出日期和时间以及过期日期和时间。 注意该方法只是返回更新后的 FormsAuthenticationTicket 对象,并不会写入 Cookies。

GetAuthCookie
为给定的用户名创建身份验证 Cookie,并不添加到响应的 Cookie 集合或 URL。

SetAuthCookie
为提供的用户名创建一个身份验证票证,并将其添加到响应的 Cookie 集合或 URL。

SignOut
从浏览器删除 Forms 身份验证票证。

6. 票证自定义数据应用

使用自定义票证时,我们可以添加一个 userData 参数。善加利用这个参数还是能带了一些意想不到的好处的,诸如存储用户 VIP 等级编号,所拥有的权限/角色集合等。当然 Cookie 和 URL 参数长度有限,这个自定义数据不能太长。

asp.net mvc forms身份认证

web.config配置 增加一个Attribute类,继承自AuthorizeAttributepublic class CustomAu
  • letmefish
  • letmefish
  • 2016年08月10日 16:44
  • 1922

ASP.NET Forms验证详解

创建网站中,常常会使用到身份验证。asp.net中内置了几种身份验证的方式,如Windows、Froms、Passport等。这几种身份验证的方式各有不同。一般来说,网站的身份验证方式都会经过以下几个...
  • moonpure
  • moonpure
  • 2015年04月25日 15:23
  • 2049

[.NET 基于角色安全性验证] 之三:ASP.NET Forms 身份验证

在开发过程中,我们需要做的事情包括:1. 在 web.config 中设置 Forms 身份验证相关参数。2. 创建登录页。登录页中的操作包括:1. 验证用户名和密码是否正确。2. 创建身份验证票证对...
  • sunchaohuang
  • sunchaohuang
  • 2007年07月04日 23:26
  • 1171

ASP.NET Forms 身份验证

ASP.NET Forms 身份验证 ASP.NET Forms 身份验证 概述 ...
  • apinghappy
  • apinghappy
  • 2007年07月18日 10:30
  • 1124

ASP.NET Windows身份验证

http://www.cnblogs.com/fish-li/archive/2012/05/07/2486840.html
  • zhulongxi
  • zhulongxi
  • 2016年07月11日 11:59
  • 295

ASP.NET身份验证过滤页面

在开发中我们经常用到某些页面不允许匿名用户登陆的功能.设置某些页面不允许匿名登陆,和匿名时跳转的页面xml version="1.0" encoding="utf-8" ?>configuration...
  • lhypang2006
  • lhypang2006
  • 2007年08月25日 12:55
  • 579

asp.net webservice 安全 验证

做了一段时间的webservice,跨平台,标准化,等优点就不多说了,可是缺点也有很多。 特别是安全问题上,只要是知道webservice地址通过asp.net 的web服务就能访问,而且方法都是显...
  • lzy_1515
  • lzy_1515
  • 2011年11月29日 14:52
  • 4303

asp.net身份验证方式

ASP.NET身份验证模式包括Windows、Forms(窗体)、Passport(护照)和None(无)。重点内容 Windows身份验证 常结合应用程序自定义身份验证使用使用这种身份验证模式时,...
  • AkashaicRecorder
  • AkashaicRecorder
  • 2016年01月06日 22:01
  • 618

转:ASP.NET MVC:窗体身份验证及角色权限管理示例

前言   本来使用Forms Authentication进行用户验证的方式是最常见的,但系统地阐明其方法的文章并不多见,网上更多的文章都是介绍其中某一部分的使用方法或实现原理,而更多的朋友则发...
  • lenovouser
  • lenovouser
  • 2016年08月09日 22:47
  • 1303

Form身份验证基本原理

先说说Form身份验证思路:假设用户要浏览需要权限的页面,此时,安全机制先启动,检查当前用户请求是否持有用户票据的Cookie如此Cookie存在:解析Cookie中的票据信息,获得用户角色,创建用户...
  • lulu_jiang
  • lulu_jiang
  • 2010年06月10日 17:12
  • 6193
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[.NET 基于角色安全性验证] 之三:ASP.NET Forms 身份验证
举报原因:
原因补充:

(最多只允许输入30个字)