在MVC中运行任何Controller Action之前调用Session

Dav*_*vid 0 asp.net-mvc session action controller global-asax

我在Session_OnStart()调用中的global.asax文件中进行了此身份验证检查:

if (Session["Authenticated"] == null)
        {
            Response.Redirect("~/Login.aspx");
        }
Run Code Online (Sandbox Code Playgroud)

这种会话身份验证在我们所有的Web应用程序中紧密耦合,因此我必须以这种方式使用它.这个global.asax位于一个较旧的Webforms项目中,我的MVC项目就位于该项目中.因此我认为它允许我直接访问我的控制器操作,例如http:// localhost/controller/action,而不会填充会话身份验证,即它没有重定向.我已经将这段代码添加到EACH控制器操作中来解决这个问题,但有没有办法在全局(而不是在global.asax中)设置它,这样我只需要为所有控制器操作调用一次?谢谢.

jim*_*lan 6

您应该创建一个所有控制器继承的基本控制器.然后你只需要在一个地方有逻辑.即:

public abstract class BaseController : ControllerBase
Run Code Online (Sandbox Code Playgroud)

然后,您可以在新的BaseContoller中使用initialize方法来执行通用逻辑.即

[编辑] - 改为OnActionExecuting,而不是Initialize.这不是最优雅的地方,因为我们正处于被调用视图的尖端​​.然而,这是一个起点.

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    // you should be able to get session stuff here!!
    base.OnActionExecuting(filterContext);
}
Run Code Online (Sandbox Code Playgroud)

并在每个控制器中:

public class AnotherNormalController : BaseController
Run Code Online (Sandbox Code Playgroud)