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


    http://caca.cnblogs.com/archive/2004/07/11/23256.aspx

    文件目录为:

     +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);
    }


  • 相关阅读:
    LeetCode with Python -> Linked List
    拼多多2018校招编程题汇总 Python实现
    Windows命令行中pip install jieba,但没有安装到anaconda3中
    sklearn快速入门
    人工神经网络在肺结核诊断中应用的研究进展
    Leetcode with Python -> Array
    标签语义空间生成
    leetcode with python -> tree
    读书笔记——中文信息处理发展报告(2016)
    移动开发学习记录
  • 原文地址:https://www.cnblogs.com/flyfish/p/352108.html
Copyright © 2020-2023  润新知