我有一个带有前端和后端的MVC3 Web应用程序。在后端,如果用户未登录(它检查会话),则每个操作都受if..then..else重定向到另一个操作的保护。这样做没有Windows角色。
我想知道是否可以创建一个执行检查的属性并将用户重定向到登录页面而不必在每个操作中反复插入相同的代码?
编辑#1
我已经创建了一个基本控制器,我的管理员控制器从中导出并添加了以下成员,后面是病毒所说的:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
try
{
if (Session["loggedIn"] == null || (bool)Session["loggedIn"] != true)
{
TempData["targetAction"] = ControllerContext.ParentActionViewContext.RouteData.Values["action"] + "/" + ControllerContext.ParentActionViewContext.RouteData.Values["controller"];
RedirectToRoute("Admin/Login");
}
}
catch (NullReferenceException)
{
RedirectToRoute("Admin/Login");
}
}
但是这段代码不起作用。有人可以告诉我有什么问题吗?
答案 0 :(得分:6)
你可以轻松地做到这一点。
无需使用属性
只需创建一个继承自Controller类的公共BaseController, 并从BaseController继承所有控制器
覆盖BaseController中的OnActionExecuting事件,并将授权逻辑放在该事件上。
每次调用操作时都会执行OnActionExecuting事件。
如果您需要重定向到Action,此代码将有所帮助
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "action", "Index" }, { "controller", "Account" } });
答案 1 :(得分:0)
这就是内置AuthorizeAttribute过滤器的作用。
您可以在全局级别,控制器级别甚至是操作级别使用AuthorizeAttribute
过滤器。如果内置的授权过滤器不够,您可以按照此post中的说明继承,轻松创建自定义过滤器。