C#,ASP.NET - 限制对控制器方法的访问

时间:2017-03-13 14:58:44

标签: c# asp.net

我正在构建一种排序系统,要求用户在进入网站的主要订购部分之前登录。例如,我有一个登录控制器(如果用户存在于数据库中)将其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之外有更有效的方法来实现这种效果,请告诉我。

3 个答案:

答案 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,所以出于您的目的,上述代码应该适用于您希望用户登录使用的操作。