我没有使用任何默认的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; }
}
用户登录后,用户可以获得CourseController
,HomeworkController
,ExamController
的一些权限。我当前的授权是使用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语句包装起来,只需将它放在控制器代码之上。
我该怎么做呢?
答案 0 :(得分:0)
这就是过滤器的用途。特别是,对于MVC控制器,您希望创建自己的授权属性,该属性将从AuthorizeAttribute继承,然后在那里实现您自己的逻辑。在这种情况下,您自己的逻辑就是您当前控制器方法中的if语句所具有的。
示例:http://www.c-sharpcorner.com/UploadFile/56fb14/custom-authorization-in-mvc/