繁体   English   中英

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

[英]C#, ASP.NET - Restricting Access to Controller Methods

我正在构建一种排序系统,要求用户先登录才能进入网站的主要订购部分。 例如,我有一个登录控制器(如果用户存在于数据库中)将其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为null,则禁止访问其他方法操作。 因此,例如,如果他们要访问产品页面但未登录,则将其重定向到登录页面。

我对ASP.NET还是很陌生,所以如果有除Sessions之外的更有效的方法来达到这种效果,请告诉我。

您可以不使用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()
{
 ....
}

要实现所需的控制器或特定操作,应使用自定义过滤器或属性(在您的情况下为授权属性)。

请看看这个好的教程开始: https : //www.codeproject.com/articles/577776/filters-and-attributes-in-aspnet-mvc

之后,您只需要google: 授权属性asp.net mvc

根据您的评论,您可以将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.
    }
}

身份是一个更新更好的登录系统,但根据我的经验,学习曲线很大。 一旦您对Sessions更加熟悉,我建议您开始研究Identity以用于将来的项目。 会话没有问题,因此出于您的目的,以上代码应适用于您希望用户登录使用的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM