我可以手动创建Controller实例,然后以用户身份运行它吗?

例如,从控制器我想做这样的事情:

var controller = new SomeController(); //different controller //as of now, the controller.User is null, I want to set it controller.DoSomething(); 

我想设置用户,因为它使用角色来决定在这里做什么。 我宁愿将所有角色处理留在该控制器中(而不是我的代码)。 有没有办法设置用户? 或者可能将它作为同一个用户运行,因为我从同一MVC项目中的另一个控制器调用它?

编辑:在谢尔盖的帮助之后,在我的Controller BaseClass中我的解决方案:

 public T RunControllerAsCurrentUser(T controller, RouteData routeData = null) where T : ControllerBase { var newContext = new ControllerContext(new HttpContextWrapper(System.Web.HttpContext.Current), routeData ?? new RouteData(), controller); controller.ControllerContext = newContext; return controller; } 

然后使用它:

 var someController = RunControllerAsCurrentUser(new Some.NameSpace.SomeController()); var result = someController.SomeAction(); 

这取决于您的方法使用的是什么。 如果你只需要执行方法,那么你可以尝试这样的事情:

 var factory = DependencyResolver.Current.GetService() ?? new DefaultControllerFactory(); TestController controller = factory.CreateController(this.ControllerContext.RequestContext, "Test") as TestController; RouteData route = new RouteData(); route.Values.Add("action", "Test"); // ActionName, but it not required ControllerContext newContext = new ControllerContext(new HttpContextWrapper(System.Web.HttpContext.Current), route, controller); controller.ControllerContext = newContext; ActionResult result = controller.Test(); 

此方法将执行一些基本的控制器初始化,但如果您的方法使用某些参数或请求特定数据,则可能需要在RouteData.Values指定它们。

尝试这种方法,并在评论中告诉它是否适合您。

当然,使用HttpContext.User,如下:

 HttpContext.Current.User = new GenericPrincipal(WindowsIdentity.GetCurrentUser(), new String[0] /*roles*/);