我正在构建一种排序系统,要求用户在进入网站的主要订购部分之前登录。例如,我有一个登录控制器(如果用户存在于数据库中)将其ID和UserName分配给会话。
public ActionResult Login(AccountAccess userObj)
{
if (ModelState.IsValid)
{
using (SC_DBEntities db = new SC_DBEntities())
{
var accountObj = db.Users_Account.Where(u => u.Account_UserName.Equals(userObj.Account_UserName)).FirstOrDefault();
if (accountObj != null)
{
var accessObj = db.Users_Access.Where(a => a.Account_ID.Equals(accountObj.Account_ID) && a.Access_Password.Equals(userObj.Access_Password)).FirstOrDefault();
if (accessObj != null)
{
Session["Account_ID"] = accountObj.Account_ID.ToString();
Session["Account_UserName"] = accountObj.Account_UserName.ToString();
return RedirectToAction("Index", "Home");
}
}
}
}
return View(userObj);
}
如果该Session为空,我想从这里做的是阻止访问其他方法操作。因此,例如,如果他们想要访问产品页面但他们没有登录,则会重定向到登录页面。
我仍然是ASP.NET的新手,所以如果除了Sessions之外有更有效的方法来实现这种效果,请告诉我。
答案 0 :(得分:4)
你能否使用ActionFilterAttribute?
public class CheckSession: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var MySession = HttpContext.Current.Session
if(MySession["Account_ID"] == null || MySession["Account_UserName"]== null)
{
filterContext.Result = new RedirectResult(string.Format("/Account/"));
}
}
}
然后你所要做的就是把它放在你的控制器动作上 - 也可以把它放在控制器上来检查控制器里面的所有内容:
[CheckSession]
public ActionResult Purchase()
{
....
}
答案 1 :(得分:2)
要实现控制器或特定操作的所需,您应该使用自定义过滤器或属性(在您的案例授权属性中)。
请看一下这个好的教程:https://www.codeproject.com/articles/577776/filters-and-attributes-in-aspnet-mvc
之后,您只需要谷歌:授权属性asp.net mvc
答案 2 :(得分:-1)
根据您的评论,您可以将Sessions用于您要求的目的。假设用户登录时,您可以像上面一样存储用户名和ID。如果要确保某人在运行操作之前已登录,请检查这些Session变量是否为null。
与您的登录控制器代码一起,假设您有购买控制器操作:
public ActionResult Purchase()
{
//Check to see if these values have been assigned via Login Controller Action
if(Session["Account_ID"] == null || Session["Account_UserName"] == null)
{
//If so, redirect to Controller Action where user can log into.
RedirectToAction("Index", "Account")
}
else
{
//Make Purchase occur.
}
}
Identity是一个更新,更好的登录系统,但在我的经验中有一个非常大的学习曲线。一旦您对Sessions更加熟悉,我建议您开始研究未来项目的Identity。没什么"错误"使用Sessions,所以出于您的目的,上述代码应该适用于您希望用户登录使用的操作。