上回合中,我们不痛不痒的把小泥鳅的数据库从只能供在Windows下运行的Access数据库改为支持跨平台的MYSQL数据库,毫无营养的修改,本回合中,我们将把我们修改后得来的项目往Linux中部署、调试,让它适应Linux.NET的运行环境。

在本回合中,我们将讨论研究:

  1、由一个谎言引出另一个谎言

  2、遭遇大量大小写问题怎么办

  3、requestValidationMode?

  4、同一个房顶,却是不同的房间


1、由一个谎言引出另外一个谎言

当我们把小泥鳅部署上Linux之后,首页一般是没有问题的(首页能够打开,并且能够阅读里面的文章),但是当我们点击后台管理时,页面就开始变得奇怪起来,它没有像我们想象那样,出现一个填写用户名密码的界面,而是如下图所示的“问题”页面:

Linux.NET实战手记—自己动手改泥鳅(下)

通过阅读堆栈跟踪,我们大概知道程序用一个“AdminPage.CheckLoginAndPermission”的地方进去之后就开始报错,为此,我们需要先确定这个叫做“CheckLoginAndPermission”的东西到底是Mono或其他三方类库里的东西还是我们代码里的。

判断的方法也挺简单,对着Visual Studio 按“Ctrl+Shirt+F”,没错,就是查找功能,只要我们能够在项目中找到相关的代码,那就证明改方法是我们项目中自己的东西。

Linux.NET实战手记—自己动手改泥鳅(下)

通过搜索,结果还真让我们找到症结的所在,于是,我们就顺藤摸瓜的进入到该方法里面,该方法的代码如下:

/// <summary>
    /// 检查登录和权限
    /// </summary>
    protected void CheckLoginAndPermission()
    {
        if (!PageUtils.IsLogin)
        {
            HttpContext.Current.Response.Redirect("login.aspx?returnurl=" + HttpContext.Current.Server.UrlEncode(RequestHelper.CurrentUrl));
        }
        UserInfo user = UserManager.GetUser(PageUtils.CurrentUserId);

        if (user == null)       //删除已登陆用户时有效
        {
            PageUtils.RemoveUserCookie();
            HttpContext.Current.Response.Redirect("login.aspx?returnurl=" + HttpContext.Current.Server.UrlEncode(RequestHelper.CurrentUrl));

        }

        if (StringHelper.GetMD5(user.UserId + HttpContext.Current.Server.UrlEncode(user.UserName) + user.Password) != PageUtils.CurrentKey)
        {
            PageUtils.RemoveUserCookie();
            HttpContext.Current.Response.Redirect("login.aspx?returnurl=" + HttpContext.Current.Server.UrlEncode(RequestHelper.CurrentUrl));
        }

        if (PageUtils.CurrentUser.Status == 0)
        {
            ResponseError("您的用户名已停用", "您的用户名已停用,请与管理员联系!");
        }


        string[] plist = new string[] { "themelist.aspx", "themeedit.aspx", "linklist.aspx", "userlist.aspx", "setting.aspx" ,"categorylist.aspx","taglist.aspx","commentlist.aspx"};
        if (PageUtils.CurrentUser.Type == (int)UserType.Author)
        {
            string pageName = System.IO.Path.GetFileName(HttpContext.Current.Request.Url.ToString()).ToLower();

            foreach (string p in plist)
            {
                if (pageName == p)
                {
                    ResponseError("没有权限", "您没有权限使用此功能,请与管理员联系!");
                }
            }
        }
    }
CheckLoginAndPermission

相关文章: