用于验证用户身份的会话变量

时间:2014-01-29 11:39:32

标签: c# asp.net asp.net-mvc c#-4.0 session-variables

如果有人试图访问仅在登录用户后才允许的页面,我该怎么办?我已经这样做但是它不起作用,请帮助:

public ActionResult ViewMyAtdRecord()
{
    int EmplID = Convert.ToInt32(Session["Employee"]);

    if (Session["Employee"] == "")
    {
        ViewBag.Message = "NOT AUTHORIZED TO VIEW THIS PAGE";
        return View();
    }
    else 
    {
        IEnumerable<GetAtdRecord_SpResult> MyAtdRecord = DataContext.GetAtdRecord_Sp(EmplID).ToList();
        var names = (from n in DataContext.HrEmployees select n).Distinct();
        return View(MyAtdRecord);
    }
} 

实际上会议从这里开始。

public ActionResult AfterLogIn(int EmplID, String EmpPwd) 
{
    int Num_Rows = (int)DataContext.GetUser_Pwd(EmplID, EmpPwd).First().No_Rows;
    if (Num_Rows == 1) 
    {
         Session["Employee"] = EmplID.ToString() ;
         ViewBag.Message = Session["Employee"];
    }
    else
    {
         ViewBag.Message = "Log-in Failed";
    }
    return View();
}

2 个答案:

答案 0 :(得分:4)

首先,避免使用会话存储身份验证证据。它使您容易受到session fixation的攻击 - 有人可以轻松复制和重用ASP.NET_SessionId cookie的内容,特别是如果该网站可通过HTTP而非HTTPS访问。

请改用身份验证Cookie。是的,cookie有一些缺点,例如向恶意用户提供身份验证cookie的密文。然而FormsAuthenticationProvider已经考虑到了这一点。这就是为什么它通常是considered safer to use cookies

其次,尽量避免使用会话。 ASP.MVC is the ability to run sessionless的巨大优势之一,可让您在需要时轻松扩展您的网站。

答案 1 :(得分:1)

我建议使用FormsAuthentication(由@akton建议)并使用Authorize属性

修饰actions / controller

如果您想使用Session而不是FormsAuthentication,那么您可以尝试一下:

public ActionResult ViewMyAtdRecord()
{
    int empId = 0; 
    int.TryParse((string)Session["Employee"], out empId); // parse variable to int

    if (empId > 0) // we have an employee id, lets show that record.
    {
        IEnumerable<GetAtdRecord_SpResult> MyAtdRecord = DataContext.GetAtdRecord_Sp(empId ).ToList();
        var names = (from n in DataContext.HrEmployees select n).Distinct();
        return View(MyAtdRecord);
    }
    else // we do not have an employee id, show not authorized message.
    {
        ViewBag.Message = "NOT AUTHORIZED TO VIEW THIS PAGE";
        return View();
    }
}