仅具有用户访问权限的MVC控制器

时间:2014-08-08 14:01:38

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

我目前正在MVC 5中构建用户登录系统以进行练习。我想做的是,如果你有会话" UserId"那么只能使控制器可访问。

当然,我可以在每个动作中创建一个 if语句,如下所示:

public ActionResult Index()
{
    if (Session["UserId"] != null)
    {
        return View();
    }
    else
    {
        return RedirectToRoute("Home");
    }
}

但有没有办法让控制器中的所有操作都能实现?

奖金信息: 我有2个控制器 - HomeController - AccountController

2 个答案:

答案 0 :(得分:2)

您将实施授权过滤器并将该过滤器应用于您的控制器。 像这样:

public class CustomAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter
{
    public void OnAuthentication(AuthenticationContext filterContext)
    {            
    }

    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
    {            
        if (filterContext.HttpContext.Session["UserId"] == null)
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }
}

然后您可以直接将[CustomAuthentication]属性应用于控制器,或者您可以通过控制器中的每个操作执行此操作。像这样:

[CustomAuthentication]//<-- If you put it here, it applies to the whole controller
public class HomeController : Controller
{
    [CustomAuthentication]//<-- Here it only applies to the Index action
    public ActionResult Index()
    {
        return View();
    }
}

答案 1 :(得分:0)

我相信你要找的是一个自定义的ActionFilter。 ActionFilter中的代码可以在ActionResult之前执行,允许您在没有UserId会话的情况下重定向任何人。

不是在每个ActionResult中放置代码,而是执行类似这样的操作

[MyCustomActionFilter]
public ActionResult Index()
{
    return View();
}

以下是有关如何创建一个Custom Action filters in MVC

的教程