0

我有一个带有前端和后端的 MVC3 Web 应用程序。在后端,如果用户未登录(它检查会话),每个操作都受到 if..then..else 重定向到另一个操作的保护。它在没有 Windows 角色的情况下执行此操作。

我想知道是否可以创建一个属性来执行检查并将用户重定向到登录页面,而不必在每个操作中一遍又一遍地插入相同的代码?

编辑#1

我创建了一个基本控制器,我的管理控制器从该控制器派生,并根据 Virus 所说的添加了以下成员:

    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");
        }
    }

但是这段代码不起作用。有人可以告诉我有什么问题吗?

4

2 回答 2

6

你可以很容易地做到这一点。

无需使用属性

只需创建一个从 Controller 类继承的通用 BaseController,并从 BaseController 继承所有控制器

覆盖 BaseController 中的 OnActionExecuting 事件并将授权逻辑放在上面。

每次调用操作时都会执行 OnActionExecuting 事件。

如果您需要重定向到操作,此代码将有所帮助

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "action", "Index" }, { "controller", "Account" } });
于 2012-07-14T03:51:14.510 回答
0

这就是内置AuthorizeAttribute过滤器的作用。

您可以AuthorizeAttribute在全局级别、控制器级别甚至操作级别使用过滤器。如果内置的 Authorize 过滤器不足以满足您的需求,您可以通过继承它来轻松创建自定义过滤器,如本文所述

于 2012-07-14T06:04:36.440 回答