• 在asp.net使用web.config身份验证


    asp.net中使用基于角色的身份Forms验证,大致分为四个步骤

    1.配置系统文件web.config

    <system.web>
    <authentication mode="Forms" >
    <forms name=".yaoCookies" loginUrl="/duan/Manage/login.aspx" protection="All"
       timeout="20" path="/" />
    </authentication>
    </system.web>

    <forms>标签中的name表示指定要用于身份验证的 HTTP Cookie. 默认情况下,name 的值是 .ASPXAUTH。采用此种方式验证用户后,以此用户的信息建立一个FormsAuthenticationTicket类型的身份验证票,再加密序列化为一个字符串,最后将这个字符串写到客户端的name指定名字的Cookie中.一旦这个Cookie写到客户端后,此用户再次访问这个web应用时会将连同Cookie一起发送到服务端,服务端将会知道此用户是已经验证过的.

    <forms>标签中的loginurl指没有经过身份验证的用户将会自动的定向到loginurl所指向的路径. 如果验证用户有效,则生成同此用户对应的身份验证票,写到客户端的Cookie,最后将浏览器重定向到用户初试请求的页面.其中用System.Web.Security.FormsAuthentication.RedirectFromLoginPage ()方法实现重定向.

    <forms>标签中的timeout和path,是提供了身份验证票写入到Cookie过期时间和默认路径

    2.在受保护的文件夹如Manage下创建一web.config文件,内容如

    <configuration>
       <!--指定对整个Manage目录的访问权限-->
       <system.web>
          <authorization>
                <!--多个角色用,分隔-->
                <allow roles="admin,user"/>
                <deny users="*" />
            </authorization>
       </system.web>

       <!--也可控制某个页的权限

       <location path="AnnounceList.aspx">
          <system.web>
             <authorization>
                <allow roles="admin"/>
                <deny users="*" />
             </authorization>
          </system.web>
       </location>

       <location path="ConfigInfo.aspx">
          <system.web>
             <authorization>
                <allow roles="users"/>
                <deny users="*" />
             </authorization>
          </system.web>
       </location>

       -->
    </configuration>

    注:此配置内容也可以加入到系统的web.config文件中,注意加入位置:

    ........
         </system.web>

         <location path="Manage/AnnounceList.aspx">
          <system.web>
           <authorization>
            <allow roles="admin"/>
            <deny users="*" />
           </authorization>
          </system.web>
         </location>

    </configuration>

    3.登录页

    <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: #cccccc; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%">//登录按钮
    private void Button1_Click(object sender, System.EventArgs e)
    {
                 //实体类AdminUserVO对应AdminUser用户表。
                 AdminUserVO adminUserVO = new AdminUserVO();

                 adminUserVO.Uname = UserName.Text.Trim();
                 adminUserVO.Upwd = UserPwd.Text.Trim();
                 adminUserVO.LastIP = HttpContext.Current.Request.UserHostAddress;
                 adminUserVO.LastTime = DateTime.Now;

                 bool flag = (new LoginDAO()).Chk(adminUserVO);

                 if (flag)
                 {
                     //非角色验证时可以用这句:
                     //System.Web.Security.FormsAuthentication.SetAuthCookie(UserName.Text.Trim(),false);

                     //创建角色验证信息,把role信息写入到UserData中
                     SetLoginCookie(adminUserVO,adminUserVO.Roles.ToLower());

                     HttpContext.Current.Response.Redirect("Main.aspx");
                 }
                 else
                 {
                     HttpContext.Current.Response.Write("登录失败");
                 }
    }
    </DIV>  

    <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: #cccccc; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 88.76%; HEIGHT: 203px">//SetLoginCookie方法
    public static void SetLoginCookie(AdminUserVO u, string roles)
       {
        //建立身份验证票对象
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket (1,u.Uname, DateTime.Now, DateTime.Now.AddMinutes(30), false,roles,"/");
        //加密序列化验证票为字符串
        string hashTicket = FormsAuthentication.Encrypt (ticket) ;
        HttpCookie userCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket);
        HttpContext.Current.Response.Cookies.Add(userCookie);
       }
    </DIV>  
    FormsAuthenticationTicket参数说明:
    FormsAuthenticationTicket(
    int version, //设为1,版本号由系统自动提供
    string name, //用户标示,获取与身份验证 Cookie 关联的用户名
    DateTime issueDate, //Cookie 的发出时间, 设置为 DateTime.Now
    DateTime expiration, //获取 Cookie 过期的日期/时间
    bool isPersistent, //是否持久性(根据需要设置,若是设置为持久性,在发出cookie时,cookie的Expires设置一定要设置),如果已发出持久的 Cookie,则返回 true。否则,身份验证 Cookie 将限制在浏览器生命周期范围内。
    string userData, //获取存储在 Cookie 中的应用程序定义字符串,这里用上面准备好的用逗号分割的role字符串
    string cookiePath // 返回发出 Cookie 的路径。注意,窗体的路径设置为"/",这要同发出cookie的路径一致,因为刷新cookie要用这个路径。由于窗体区分大小写,这是为了防止站点中的 URL 的大小写不一致而采取的一种保护措施。
    );


    4.Global.asax.cs

    <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: #cccccc; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%">protected void Application_AuthenticateRequest(Object sender, EventArgs e)
       {
        HttpApplication app = (HttpApplication) sender;  
        HttpContext ctx = app.Context ; //获取本次Http请求的HttpContext对象  
        if (ctx.User != null)
        {
         if (ctx.Request.IsAuthenticated == true) //验证过的一般用户才能进行角色验证  
         {  
          System.Web.Security.FormsIdentity fi = (System.Web.Security.FormsIdentity)ctx.User.Identity ;  
          System.Web.Security.FormsAuthenticationTicket ticket = fi.Ticket ; //取得身份验证票  
          string userData = ticket.UserData;//从UserData中恢复role信息
          string[] roles = userData.Split (',') ; //将角色数据转成字符串数组,得到相关的角色信息  
          ctx.User = new System.Security.Principal.GenericPrincipal (fi, roles) ; //这样当前用户就拥有角色信息了
         }
        }
       }</DIV>  
    注:如果使用HttpModule的话,此处代码应该加入在AuthenticateRequest事件中。

    TrackBack:http://hi.baidu.com/educast/blog/item/327e80cb150fe2f853664f19.html

  • 相关阅读:
    内存堆与栈的区别
    深度理解相对路径和绝对路径
    INFO:InstallAnywhere的Enterprise版本和Standard版本的主要区别
    HOWTO:InstallShield中如何调用批处理文件
    HOWTO:InstallScript工程中如何在用户协议界面中默认为接受协议
    HOWTO:InstallShield中如何通过脚本获取“My Documents”路径
    INFO:InstallShield工程中关于.NET依赖项的编译扫描警告
    InstallShield Kevin Wan博客文章索引列表(001~100)
    HOWTO:在InstallShield脚本中打开一个URL链接
    INFO:在InstallShield中修改安装包压缩.cab包的大小
  • 原文地址:https://www.cnblogs.com/hdjjun/p/1223963.html
Copyright © 2020-2023  润新知