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

在开发过程中,我们需要做的事情包括:

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 参数长度有限,这个自定义数据不能太长。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值