我目前正在MVC 5中构建用户登录系统以进行练习。我想做的是,如果你有会话" UserId"那么只能使控制器可访问。
当然,我可以在每个动作中创建一个 if语句,如下所示:
public ActionResult Index()
{
if (Session["UserId"] != null)
{
return View();
}
else
{
return RedirectToRoute("Home");
}
}
但有没有办法让控制器中的所有操作都能实现?
奖金信息: 我有2个控制器 - HomeController - AccountController
答案 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
的教程