我是否可以手动创建控制器实例,然后以用户身份运行它

本文关键字:然后 用户 身份 运行 实例 控制器 是否 创建 | 更新日期: 2023-09-27 18:33:59

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

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

我想设置用户,因为它使用角色来决定在此处执行的操作。 我宁愿将所有角色处理保留在该控制器(而不是我的代码(中。 有什么方法可以设置用户吗? 或者可能以我从同一 MVC 项目中的另一个控制器调用它的同一用户身份运行它?

编辑:在谢尔盖的帮助下,在我的控制器基类中,我的解决方案:

public T RunControllerAsCurrentUser<T>(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<IControllerFactory>() ?? 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*/);
相关文章: