更一般的做法是:把 MyAppSettings 替换为你选择用来存放自定义设置标记的名称;同时把 connString 替换为在自定义设置 标记中,你希望读取的参数名称。通过这种方法,可以有效地解决上面提到的冲突,当然,特殊情况例外。
在web.config文件中,<authentication>这一区段定义了服务器进行用户验证这一过程的细节。所支持的三种不同模式是 Windows、Forms和Passport。现在我们来仔细看看每种模式:
- Windows验证通过Windows的系统帐号来验证用户,例如活动目录(Active Directory)。Windows验证是最安全的验证形
式,对于程序员来说这种模式是很简单的,因为整个过程都是由操作系统来处理的。但是,网站的每个用户都需要一个系 统帐号,所以这种模式会被限制在企业内部网(intranet)的应用程序里。
- Passport验证使用护照来验证用户,它是第二安全的验证方式。其最好的用武之地是大型的、活动的Internet电子商务应用程
序,这些程序会验证用户的服务使用费。这种模式是.NET所选择的验证方法。
- Forms验证是安全性最低的验证方法,因为必须要由你的应用程序自己来处理验证过程。但是,这是最有可能在你Internet应
用程序上使用的模式,因为它所需要的管理和维护是最少的。
应用Forms验证的一个例子如下:
文件目录为:
+BIN +Admin -index.aspx - test.aspx - *.aspx - web.config //Admin文件夹下的web.config login.aspx web.config //根目录的web.config index.aspx
(-)FormsAuthentication的重要方法以及属性 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. { 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"); 5,我们的链接不要涉及到直接连接到login.aspx,为什么?假设我们直接登陆login.asxp,那么这个URL就没有参数ReturnUrl,但是,默认是 Default.aspx(或者index.axp....),当管理员通过验证时候,页面不是直接跳转到根目录的默认页面index.aspx. (如果直接连接的话,也是可以的,利用上面的bug解决)
注销验证: 用FormsAuthentication.SignOut();
其实,上述方案并不是很安全的解决方案.只是很实用,简单,又比较安全的验证解决方案. |