ASP.NET基于表单的验证实现网上安全访问,管理

什么时候用?

比如ASP.NET程序的一个Admin文件夹,是专门进行网上管理用的(比如后台数据维护),一般访问者不能访问里面的所有文件.只有通过验证的用户才能访问.按照以前的ASP的做法,是在用户通过Login页面时,设置Session(即Cookie)来判断用户是否通过验证,每个Admin文件夹里的页面文件都要设置验证语句,而且并不是很安全,这个时候,ASP.NET的4种验证方式之一:基于表单的验证就派上了用场.您做的仅是在Admin文件夹里面放置一个只有几行语句的Web.config文件.

怎样用?

这个问题您可以去看书籍上的介绍(Wrax出版的《ASP.NET高级编程》),不过,我这里有自己常用的方式,不妨看看.
文件目录为:
 +BIN
 +Admin
    - *.aspx
    - web.config //Admin文件夹下的web.config
 login.aspx
 web.config //根目录的web.config
1,根目录的web.config的配置

<configuration>
 
<system.web>
  
<authentication mode="Forms">
   
<forms name="mycookiename" loginUrl="login.aspx" protection="All" timeout="30">
   
</forms>
  
</authentication>
  
<authorization>
   
<allow users="*"/>
  
</authorization>
 
</system.web>
</configuration>

2,Admin文件夹下的web.config的配置

<configuration>
 
<system.web>
  
<authorization>
   
<deny users="?" />
  
</authorization>
 
</system.web>
</configuration>
3,login.aspx的配置
此页面就是一个验证登陆页面:
<asp:textbox id=textname runat=server/> 帐号
<asp:textpassword id=textpassword runat=server>
密码
<asp:checkbox id=mycheckbox runat=server/>
是否记住密码,永久登陆
<asp:button runat=server onclick=btnloginclick text=登陆/>
处理事件1(当用户点击登陆按钮时候)
void  btnloginclick(Object sender,EventArgs e)
{
 
if(用户通过验证)//这一点可以在bin目录放置自己的dll文件来验证用户,返回一个bool.

 {
 FormsAuthentication.RedirectFromLoginPage(UserName.Text, mycheckbox.Checked);
//这句用来存储Cookie来说明用户UserName.Text通过的验证,可以访问Admin文件夹了,另外,如果那个永久登陆的checkbox被checked了,则这个验证Cookie的失效日期可以长达50年(默认为浏览器时间).

 ResponseRedirect("Admin");//这时,就可以畅通无阻访问Admin文件夹了.
 }

}
处理事件2(当用户已经通过验证,就没有必要在访问login.aspx时候再次输入密码了)
这个由表单验证自动完成,相当于:
void  Page_Load(Object sender,EventArgs e)
{
 
if(Context.User.Identity.IsAuthenticated)Response.Redirect("Admin"
);
}

4,注销验证:
用FormsAuthentication.SignOut();

其实,上述方案并不是很安全的解决方案.只是很实用,简单,又比较安全的验证解决方案.

最近阅读了Wrax版的《ASP.NET安全性高级编程》,里面涉及了基于Forms的验证,发现自己有很多误解,于是决定对《ASP.NET基于表单的验证实现网上安全访问,管理》一文补充与更正.
  
  文件目录为:
  
  
   +BIN
   +Admin
   -index.aspx
   - test.aspx
   - *.aspx
   - web.config //Admin文件夹下的web.config
   login.aspx
   web.config //根目录的web.config
   index.aspx
  
  
  (-)看看FormsAuthentication的重要方法以及属性(更多search MSDN)
  
  FormsCookieName
   返回用于当前应用程序的已配置 Cookie 名称。
  GetAuthCookie
   为给定的用户名创建身份验证 Cookie。这不会将 Cookie 设置为传出响应的一部分,因此应用程序对如何发出该 Cookie 有更多的控制权限。
  Authenticate
   给定所提供的凭据,尝试根据包含在已配置凭据存储区中的凭据对凭据进行验证。
  GetRedirectUrl
   返回导致重定向到登录页的原始请求的重定向 URL。
  HashPasswordForStoringInConfigFile
   给定标识哈希类型的密码和字符串,该例程产生一个适合存储在配置文件中的哈希密码。
  RedirectFromLoginPage
   将已验证身份的用户重定向回最初请求的 URL。
  {=========
  备注
  RedirectFromLoginPage 方法重定向到在查询字符串中指定的返回 URL 键。例如,在 URL http://www.contoso.com/login.aspx?ReturnUrl=caller.aspx 中,caller.aspx 是 RedirectFromLoginPage 所重定向到的返回 URL。如果返回键不存在,则 RedirectFromLoginPage 将重定向到 Default.aspx。
   =========}
  SetAuthCookie
   创建身份验证票并将其附加到 Cookie 的传出响应的集合。它不执行重定向。
  SignOut
   移除身份验证票.
  
  (二)让我们一步一步彻底明白页面是怎样验证的
  
  再次说明我们验证的目的:
   Admin文件夹是管理员进行后台管理的"专区",只有通过login.aspx登陆验证后才能进入Admin文件夹里面访问里面的所有页面,所有,我们必须通过填写login.aspx的表单来验证用户是否是管理员.
  
  (1) 假设我们在根目录的index.aspx设置一个连接<a href=login.aspx>管理员登陆</a>,管理员可以通过这个连接,访问login.aspx进行填写表单.这里出现了一个奇妙的思维定势的问题,我们习惯这个"管理员登陆"连接来连接到login.aspx,其实在这里,我们错了,应该"直接"连接到Admin文件夹(或者里面的任何页面),有人问:"这岂不是普通访问者也可以通过这个连接直接连接到了Admin的页面了吗?",我说:"对!,这就是基于表单验证的美妙之处,不用担心这个问题,看看我们的2个web.config就明白了!".
  
  看看Admin文件夹里面的web.config 

<configuration>  
    
<system.web>
 
        
<authorization>
 
            
<deny users="?" />
 
        
</authorization>
 
    
</system.web>
 
</configuration>

 
  有一个<deny users="?"/>,就是说没有通过验证的匿名用户绝对禁止访问这个文件夹-Admin.
  那么,如果匿名用户真的这样做了(试图连接Admin文件夹里面的页面)会怎样呢?哈哈,会定向到login.aspx页面的,看看根目录的web.config 

<configuration>  
    
<system.web>
 
        
<authentication mode="Forms">
 
            
<forms name="mycookiename" loginUrl="login.aspx" protection="All" timeout="30">
 
            
</forms>
 
        
</authentication>
 
        
<authorization>
 
            
<allow users="*"/>
 
        
</authorization>
 
    
</system.web>
 
</configuration>

根目录的web.config设置了验证方式,以及相应的处理情况.
  <authentication mode="Forms">来设置了验证方式mode="Forms";
  <forms name="mycookiename" loginUrl="login.aspx" protection="All" timeout="30"/>
  看到了loginurl="login.aspx"了吗?就是说,如果匿名用户试图连接受保护的页面(Admin文件夹),则定向到login.aspx,来让这个匿名用户登陆!
  
  (2)我们点击了那个"管理员登陆"链接,来到了login.aspx.此时你会发现,URL地址其实是:login.asxp?ReturnUrl=admin/index.asp(其实就是我们所请求的页面),如果我们在login.asxp通过了验证,那么,页面会自动跳转到那个ReturnUrl.
  
  看看login.aspx: 

<asp:textbox id=textname runat=server/> 帐号 
<asp:textpassword id=textpassword runat=server>
密码 
<asp:checkbox id=mycheckbox runat=server/>
是否记住密码,永久登陆 
<asp:button runat=server onclick=btnloginclick text=登陆/>

处理事件1(当用户点击登陆按钮时候) 

void  btnloginclick(Object sender,EventArgs e) 

    
if(用户通过验证)//这一点可以在bin目录放置自己的dll文件来验证用户,返回一个bool. 

    
        FormsAuthentication.RedirectFromLoginPage(UserName.Text, mycheckbox.Checked); 
    }
 
}

1,FormsAuthentication.RedirectFromLoginPage(UserName.Text, mycheckbox.Checked);的作用:
  ->设置一个验证Cookie,说明用户已经通过验证.
  ->返回刚才您所请求的页面(Admin/index.aspx); 

2,这句话相当于这两句:
  FormsAuthentication.SetAuthCookie(UserName.Text,mycheckbox.Checked);
  Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName.Text,mycheckbox.Checked); 
3,如果mycheckboxt控件已经选择,则,写入cookie,保存50年,当然,我们可以更改这个时间: 

处理事件1(当用户点击登陆按钮时候)   
  

void btnloginclick(Object sender,EventArgs e) 
    
if(用户通过验证)//这一点可以在bin目录放置自己的dll文件来验证用户,返回一个bool. 

        
             HttpCookie authenticationCookie
=
FormsAuthentication.GetAuthcookie(UserName.Text,mycheckbox.Checked); 
             authenticationCookie.Expires
=DateTime.Now.AddDays(3);//3天 

             Response.Cookies.Add(authenticationCookie); 
             Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName.Text,mycheckbox.Checked); 
        }

}

4,这里有个bug,我不知道为什么会这样,我们这样:
  处理事件1(当用户点击登陆按钮时候) 

void  btnloginclick(Object sender,EventArgs e) 

    
if(用户通过验证)//这一点可以在bin目录放置自己的dll文件来验证用户,返回一个bool. 

    
         FormsAuthentication.RedirectFromLoginPage(UserName.Text, mycheckbox.Checked); 
         Response.Redirect(
"http://www.QuickResponser.com"
); 
     }
 
}

会怎样呢?按理说应该执行FormsAuthentication.RedirectFromLoginPage(UserName.Text, mycheckbox.Checked);
  然后跳转到请求的页面admin/index.aspx.
  可是,我在实际试验过程中,发现页面执行了Response.Redirect("http://www.QuickResponser.com");
  oh,mygod!!!!,郁闷(谁给我个正确的解释呢?QQ:154222225 Mail:root@3ney.com);
  5,我们的链接不要涉及到直接连接到login.aspx,为什么?假设我们直接登陆login.aspx,那么这个URL就没有参数ReturnUrl,但是,默认是Default.aspx(或者index.aspx....),当管理员通过验证时候,页面不是直接跳转到根目录的默认页面index.aspx.
  (如果直接连接的话,也是可以的,利用上面的bug解决)
  
  参考:
  1,《ASP.NET高级编程》--Wrax
  2,《ASP.NET安全性高级编程》--Wrax
  =============================
  废话很多,希望大家能看明白.
  基于表单的验证涉及的其他问题:
  1,无Cookie的验证
  2,验证数据的存储方式
  3,基于角色的表单验证
  .....

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值