none
关于网站后台登录的问题? RRS feed

  • 问题

  • 网站要求实现前台普通用户和后台管理员登录分离,就是会员用根目录的login.aspx登录,管理员用admin文件夹下的Login.aspx登录,我admin文件夹下的web.config(内容如下)应该如何配置?

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <appSettings/>
      <connectionStrings/>
      <system.web>
       <authorization>
        <deny users="?" />
        <allow roles="管理员"/>
        <allow roles="超级管理员"/>
        <deny users="*"/>
       </authorization>
      </system.web>
    </configuration>
    
    
    我现在这样配置会自动跳转到更目录下的login.aspx(汗)。

    • 已移动 孟宪会Moderator 2011年2月22日 0:48 (发件人:.NET Framework 一般性问题讨论区)
    2011年2月21日 9:13

答案

  • 首先,不建议使用中文作为roles的名称

    再次,需要在 Global里Application_AuthorizeRequest事件里面 进行处理,

    然后页面Page.User.IsInRole()里进行判断

     

    HttpApplicationApp=(HttpApplication)sender;
    HttpContextCtx=App.Context;//获取本次Http请求相关的HttpContext对象
    if(Ctx.Request.IsAuthenticated==true)//验证过的用户才进行role的处理
    {
    FormsIdentityId=(FormsIdentity)Ctx.User.Identity;
    FormsAuthenticationTicketTicket=Id.Ticket;//取得身份验证票
    string[]Roles=Ticket.UserData.Split(',');//将身份验证票中的role数据转成字符串数组
    Ctx.User=newGenericPrincipal(Id,Roles);//将原有的Identity加上角色信息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息
    }

    如果进行加密了,这里还得先解密


    【孟子E章】
    2011年2月25日 7:57
    版主

全部回复

  • 您好,您贴的配置是有关授权的,而不是身份验证。但明白您的意思。

    对于身份验证来说一个web app在web.config中只能有一个login.aspx配置。

    这里有一篇文章,希望有帮助:http://www.7880.com/info/Article-82a12980.html

     

    2011年2月21日 13:10
    版主
  • login页面只能是一个的,你可以采用下面的方法

     在 ASP.NET 中实现不同角色的用户使用不同登录界面的方法



    【孟子E章】
    2011年2月22日 0:48
    版主
  • 晕菜,不知道为什么我上面贴的链接对应的内容和我昨天看的不一样。好在我copy了一下。我又看了一下老孟提供的,楼主请参考老孟的。这个是完整的。

    我贴出昨天那个链接中关键的内容,大致和老孟的一样。

    “ASP.NET实现不同角色的用户使用不同登录界面的方法,很多用户在开发 ASP.NET 应用程序时都有这样的需求:管理员角色的账户使用管理员的登录界面进行登录,普通用户角色的账户使用普通用户的登录界面进行登录。由于ASP.NET的web.config里只能使用一个 authentication mode="Forms" 节点,所以,要实现不同用户采用不同的登录界面,一个办法就是创建一个管理员专用的虚拟目录,并设置为应用程序来实现。下面介绍另外一种采用重定向的办法来解决这个问题。
    本文介绍的方法原理是根据登录界面的返回地址进行判断,然后重定向到不同的页面。下面就是实现的详细过程。

    1,创建一个网站,在网站里创建Admin文件夹和User文件夹,分别存放admin和普通用户所使用的文件。也可以只设置一个 Admin 文件夹。由于本方法采用的判断返回路径的方法,所以,要能从路径中区分出哪些是admin用户使用的文件夹。当然,采用其他的判断方法也是可以的。

    2,在网站根目录下分别创建3个登录文件:Login.aspx、UserLogin.aspx和AdminLogin.aspx。其中Login.aspx文件起地址转换的作用,
    Login.aspx文件的主要内容:
    protected void Page_Load(object sender, EventArgs e)
    {
    String ReturnUrl = Request.QueryString["ReturnUrl"];
    if (ReturnUrl == null || ReturnUrl.Equals(String.Empty))
    {
      //默认情况下,按普通用户进行登录
      Response.Redirect("~/UserLogin.aspx");
    }
    else
    {
      if (ReturnUrl.ToLower().Contains("/admin/"))
      {
        Response.Redirect("~/AdminLogin.aspx?ReturnUrl=" + Server.UrlEncode(ReturnUrl));
      }
      else
      {
        Response.Redirect("~/UserLogin.aspx?ReturnUrl=" + Server.UrlEncode(ReturnUrl));
      }
    }”

    2011年2月22日 2:13
    版主
  • 谢谢版主!我用你的方法实现了管理员和用户登录分离,但我管理员通过验证后,后台进不去了,是不是我admin文件夹下的web.config写的不正确?

     public static bool AdminLogin(string LoginID,string PWD)
     {
          string strpwd = BitConverter.ToString((new MD5CryptoServiceProvider()).ComputeHash(Encoding.Default.GetBytes(PWD))).Replace("-", "");
          bool result = dal.AdminVerify(LoginID, strpwd, out info);
          if (result)
          {
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, LoginID, DateTime.Now, DateTime.Now.AddMinutes(60), true, "管理员");
            if (info.intStatus==1)
            {
              ticket = new FormsAuthenticationTicket(1, LoginID, DateTime.Now, DateTime.Now.AddMinutes(60), true, "超级管理员");
            }
            HttpCookie hc = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
            HttpContext.Current.Response.Cookies.Add(hc);
          }
          return result;
    }
    这是我验证管理员的代码!

    • 已编辑 雪之翼 2011年2月25日 5:15 添加代码
    2011年2月25日 5:10
  • 首先,不建议使用中文作为roles的名称

    再次,需要在 Global里Application_AuthorizeRequest事件里面 进行处理,

    然后页面Page.User.IsInRole()里进行判断

     

    HttpApplicationApp=(HttpApplication)sender;
    HttpContextCtx=App.Context;//获取本次Http请求相关的HttpContext对象
    if(Ctx.Request.IsAuthenticated==true)//验证过的用户才进行role的处理
    {
    FormsIdentityId=(FormsIdentity)Ctx.User.Identity;
    FormsAuthenticationTicketTicket=Id.Ticket;//取得身份验证票
    string[]Roles=Ticket.UserData.Split(',');//将身份验证票中的role数据转成字符串数组
    Ctx.User=newGenericPrincipal(Id,Roles);//将原有的Identity加上角色信息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息
    }

    如果进行加密了,这里还得先解密


    【孟子E章】
    2011年2月25日 7:57
    版主