posts - 244,  comments - 528,  trackbacks - 6

补充: 12:39 2004-7-11

最近阅读了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.axp:

<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.asxp,那么这个URL就没有参数ReturnUrl,但是,默认是Default.aspx(或者index.axp....),当管理员通过验证时候,页面不是直接跳转到根目录的默认页面index.aspx.
(如果直接连接的话,也是可以的,利用上面的bug解决)

参考:
1,《ASP.NET高级编程》--Wrax
2,《ASP.NET安全性高级编程》--Wrax
=============================
废话很多,希望大家能看明白.
基于表单的验证涉及的其他问题:
1,无Cookie的验证
2,验证数据的存储方式
3,基于角色的表单验证
.....
作者:caca @ zzu @ 14:15 2004-7-11 @ QQ:154222225 @Mail:root@3ney.com
=============================

posted on 2004-07-11 21:02 cacard 阅读(6679) 评论(13)  编辑 收藏 网摘 所属分类: ASP.NET

FeedBack:
2004-07-11 21:23 | kwklover
2004-07-12 10:08 | 励马
关于
----------------------
void btnloginclick(Object sender,EventArgs e)
{
 if(用户通过验证)//这一点可以在bin目录放置自己的dll文件来验证用户,返回一个bool.
 {
 FormsAuthentication.RedirectFromLoginPage(UserName.Text, mycheckbox.Checked);
 Response.Redirect("http://www.QuickResponser.com"">http://www.QuickResponser.com"">http://www.QuickResponser.com"">http://www.QuickResponser.com");
 }
}
可是,我在实际试验过程中,发现页面执行了Response.Redirect("http://www.QuickResponser.com"">http://www.QuickResponser.com"">http://www.QuickResponser.com"">http://www.QuickResponser.com");
oh,mygod!!!!,郁闷
-------------------------
这个的问题,要是在
 Response.Redirect("http://www.QuickResponser.com"">http://www.QuickResponser.com"">http://www.QuickResponser.com"">http://www.QuickResponser.com");
加入
 Response.Redirect("http://www.163.com");
会怎么样呢?

:),它们的原理是一样的!

  回复  引用    
2004-10-15 11:00 | Axue
Response.Cookies是把Cookies写在客户端,你认为这样会安全吗

有没有办法,把他写在Session里面呢?至少写服务端比客户要安全些

因为永久管理登录其实也没什么多大作用

  回复  引用    
2004-10-16 10:54 | caca
(1)永久管理登陆这个把柄掌握在用户自己手中,所以这个永久Cookie的安全前提是用户认为自己的电脑是安全的,在公用计算机上选择永久Cookie是用户自己的安全意识问题.使用永久Cookie,必须将Cookie写在用户的硬盘上,安全的问题肯定是有的,但我们可以做一些措施,例如加密Cookie.
(2)Session分2种:
一种是服务器Session,存储在服务器的IIS进程中(也可以单独存储在aspnet_state.exe进程中,还有远程服务器上或者SqlServer上)
一种是客户端Cookie,这个就是那个SessionID了。
而对于客户端存储Session又分有无Cookie的两种情况.无Cookie则Session存储在URL地址中。
(3)再看看把那个永久登陆Cookie信息存储在服务器中的Session中的可行性:
Session的Timeout是Web.config来确定的,所以不可能因为这个永久登陆信息的Session而把所有的Session的Timeout都设置为永久。

  回复  引用    
2004-11-11 23:40 | huangsuipeng(hsp.net)
look :

Response.Redirect("/Webdate/WebForm1.aspx", true);
The Response.End method ends the page execution and shifts the execution to the Application_EndRequest event in the application's event pipeline. The line of code that follows Response.End is not executed.
This problem occurs in the Response.Redirect and Server.Transfer methods because both methods call Response.End internally.
Response.Redirect("/Webdate/WebForm1.aspx", false);
If you use this workaround, the code that follows Response.Redirect is executed.


  回复  引用    
2006-11-20 15:10 | raid数据恢复[未注册用户]
嗯 很游泳
  回复  引用    
2006-11-20 15:11 | 上海数据恢复[未注册用户]
路过。。。。先收藏着 不错的文章
  回复  引用    
2006-11-20 15:11 | raid数据恢复[未注册用户]
我也来看看
  回复  引用    
2006-11-20 15:12 | 数据恢复[未注册用户]
好像有点用处。 回头改改去
  回复  引用    
2006-11-20 15:13 | 松花粉[未注册用户]
路过。。。给楼主留个脚印
  回复  引用    
2006-11-20 15:14 | 上海数据恢复[未注册用户]
有空也来我的站做做, 是数据恢复网站。
  回复  引用    
2006-11-20 15:15 | 数据恢复[未注册用户]
数据恢复硬盘数据修复服务
  回复  引用    
2008-01-03 17:24 | dcb[未注册用户]
这个东西很高级说...我才学asp.net的时候就用的这个东东啊....必须把不用验证的东东放在那个文件夹外面好麻烦啊
  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 23256 xtCbViwWg5U=



相关文章:

相关链接:



NickName 卡卡 ^ cacard
MSN billgate(at)live.com
Email cacard(at)126.com


搜索

 

随笔分类

随笔档案

朋友

推荐网站

最新评论

  • 1. re: 情绪的作用
  • 总有一天这个系列的思想会停止,这个时候你长大了,或者说麻木了
  • --对月而歌
  • 2. re: 奇怪的IndexOutOfRangeException
  • 基本解决: !9C763BD9399B0328!2083.entry 另外,IndexOutOfRange只是在访问SqlServer时的表现,在访问Sybase数据库时可能会遭遇从驱动抛上来的错误“...
  • --lonegunman
  • 3. re: 奇怪的IndexOutOfRangeException
  • me too call me
  • --yuzhang233
  • 4. re: 情绪的作用
  • 卡卡同学 你现在都在想什么?
    怎么。。。
  • --baibai
  • 5. re: 理性与感性
  • 有个故事,说一位老头带着亮个儿子穿越一座山,突然遇到百年难遇的暴风雪,老透凭着多年的经验,说:“你们赶紧回去,我走的慢,会‘连累’你们。”可是他的儿子们一片孝心,谁的没离开老头,谁都没离开那场暴风雪,...
  • --NIHAIRUI

阅读排行榜

评论排行榜

This is footer