在同一 IF 语句中检查 Cookie 和会话

Check Cookies AND Session in Same IF Statement

我有一个功能可以检查 Session 和 Cookie 并根据它们重定向用户。

private void CheckRecruiterLogin()
    {
        List<string> list = new List<string>();
        if (Session["Candidate"] != null ||
            Request.Cookies["Candidate"] != null)
        {
            list = (List<string>)Session["Candidate"];
            string status = list[1].ToString();
            if (status.Equals("applicant") ||
                Request.Cookies["Candidate"]["Status"].Equals("applicant"))
            {
                Response.Redirect("ApplicantHome.aspx");
            }
            if (status.Equals("preboarding") ||
                Request.Cookies["Candidate"]["Status"].Equals("preboarding"))
            {
                Response.Redirect("PreboardingHome.aspx");
            }
            else if (status.Equals("hiring") ||
                Request.Cookies["Candidate"]["Status"].Equals("hiring"))
            {
                Response.Redirect("HiringHome.aspx");
            }
        }
        else if (Session["HR"] != null || Request.Cookies["HR"] != null)
        {
            list = (List<string>)Session["HR"];
            string type = list[1].ToString();
            if (type.Equals("preboarder") ||
                Request.Cookies["HR"]["Type"].Equals("preboarder"))
            {
                Response.Redirect("PreboarderList.aspx");
            }
            else if (type.Equals("datamanager") ||
                Request.Cookies["HR"]["Type"].Equals("datamanager"))
            {
                Response.Redirect("HiringList.aspx");
            }
            else if (type.Equals("admin") ||
                Request.Cookies["HR"]["Type"].Equals("admin"))
            {
                Response.Redirect("AdminHome.aspx");
            }
        }
        else if (Session["HR"] == null &&
            Request.Cookies["HR"] == null)
        {
            Response.Redirect("index.aspx");
        }
    }

但是应用程序抛出一个运行时异常说 Object reference not set to an instance of an object. 我相信这是因为没有 cookies 存在。

我的问题是:我应该将会话和cookie的检查分开,还是可以在一个语句中完成?

谢谢!

您的代码需要 cookie 和会话。

如果这是有意的,您想要更改条件以使用 && 而不是 ||

但是,您更有可能希望代码在可用时使用会话,而在会话不存在时使用 cookie。这非常简单,只需将值存储在一个变量中,然后再使用它:

if (Session["Candidate"] != null || Request.Cookies["Candidate"] != null)
{
  var list = Session["Candidate"] as List<string>;
  var status = list == null ? Request.Cookies["Candidate"]["Status"] : list[1];

  if (status == "applicant")
  {
    ...
  }
  ...
}

也就是说,像这样使用 cookie 进行安全检查是个坏主意 - 它们是用户可见的并且用户可编辑的。

此外,使用 Equals 没有意义 - 只需使用 ==。这不是 Java,.NET 实际上比较的是值,而不是引用。虽然实际使用不变文化、不区分大小写的平等进行比较可能是一个更好的主意。创建 new List<string> 也没有意义 - 该值从未使用过。只需在您已经有东西可以填充的地方声明变量。

您直接检查 Request 是否有一个名为“HR”的 cookie,如果没有这个名称的 cookie,它将抛出异常。因此,您首先需要检查 CookieCollection 是否有任何名称为“HR”的 cookie。这是检查 CookieCollection 是否有给定名称的 cookie 的方法。

if(Request.Cookies.Get("cookieNmae") !=null)

所以像这样更改您的 if 语句

if (Session["HR"] != null || Request.Cookies.Get("HR") !=null)