如何使用Cookie会话和本地数据库进行自定义授权?

时间:2016-05-12 02:06:05

标签: c# asp.net asp.net-mvc session cookies

我没有使用任何默认的ASP.NET MVC授权,因此我创建了自己的授权cookie和&为了我的安全,我的项目会话。下面的代码是我的函数Login,第一次生成cookie和会话。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(User user)
{
    bool ValidEmail = db.Users.Any(u => u.Username == user.Username);

    if (!ValidEmail)
    {
        return RedirectToAction("Login", "Home");
    }

    string Password = db.Users.Where(u => u.Username == user.Username).Select(u => u.Password).Single();
    user.Password = GenerateHashPassword(user.Password);

    if (Password != user.Password)
    {
        return RedirectToAction("Login", "Home");
    }

    string AuthID = Guid.NewGuid().ToString();
    Session["AuthID"] = AuthID;
    var Cookie = new HttpCookie("AuthID");
    Cookie.Values["AuthID"] = AuthID;
    Cookie.Values["Username"] = user.Username;
    Cookie.Values["LastVisit"] = DateTime.Now.ToString();
    Cookie.Expires = DateTime.Now.AddDays(365);
    Response.Cookies.Add(Cookie);

    return RedirectToAction("Index", "Course");
}

我的用户模型是:

public class User
{
     public string UserID { get; set; }
     public string Username { get; set; }
     public string Password [ get; set; }
}

用户登录后,用户可以获得CourseControllerHomeworkControllerExamController的一些权限。我当前的授权是使用if-statement来控制这些控制器中的每个函数:

[HttpGet]
public ActionResult Index()
{
    try
    {
        if (Request.Cookies["AuthID"].Values["AuthID"] == Session["AuthID"].ToString())
        {
             // main code here ... 
        }
        else
        {
             return RedirectToAction("Index", "Home");
        }
    }
    catch
    {
        return RedirectToAction("Index", "Home");
    }
}

我希望使用默认的ASP.NET授权,即 [授权] 来保护这些控制器。这将把所有这些if语句包装起来,只需将它放在控制器代码之上。

我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

这就是过滤器的用途。特别是,对于MVC控制器,您希望创建自己的授权属性,该属性将从AuthorizeAttribute继承,然后在那里实现您自己的逻辑。在这种情况下,您自己的逻辑就是您当前控制器方法中的if语句所具有的。

示例:http://www.c-sharpcorner.com/UploadFile/56fb14/custom-authorization-in-mvc/