MVC 3,忍者 2.2。
我有一个需要临时覆盖绑定的场景。覆盖仅适用于控制器中的操作的持续时间。
我需要的是这样的:
[HttpGet, Authorize(Users="MySpecialAccount")]
public ActionResult Report(string userName) {
var reportViewModel = new ReportViewModel();
using(var block = Kernel.BeginBlock() {
var principal = //load principal info based on userName;
block.Rebind<IMyPrincipal>().ToConstant(principal);
reportViewModel = GetViewModel(); //calls bunch of repos to hydrate view model that reference IMyPrincipal
}
return View(reportViewModel);
}
背景:
该应用程序使用 Windows 身份验证。我有一个加载自定义主体的自定义提供程序。我们将这个自定义主体注入到我们的 repos/services/etc 中,并帮助我们根据经过身份验证的用户加载适当的数据。长期以来,这一切都很好。现在我有一个场景,我在一个动作中使用模拟。原因可能超出范围,但基本上我使用的是 HTMLToPDF 编写器,它启动一个单独的进程以在不同的帐户下加载 HTML/Action。无论如何,因为我在这一个动作中冒充,所以我的所有存储库都无法加载正确的信息,因为发出请求的不是用户,这是有道理的。所以我发送了一个我们需要为其运行报告的“谁”参数,并且我需要临时重新绑定自定义主体。
希望这是有道理的。以下是加载自定义主体的当前代码片段。
In Global.asax:
protected void WindowsAuthentication_OnAuthenticate(Object source, WindowsAuthenticationEventArgs e)
{
if (e.Identity.IsAuthenticated)
{
//goes to db and loads additional info about logged on user. We use this info in repos/services to load correct data for logged on user.
var principal = new PrincipalFactory().GetPrincipal(e.Identity);
e.User = principal;
}
}
//Ninject Binding
Bind<IMyPrincipal>().ToProvider(new MyPrincipalProvider());
//Provider
public class MyPrincipalProvider : Provider<IMyPrincipal>
{
protected override IMyPrincipal CreateInstance(IContext context)
{
var principal = HttpContext.Current.User as IMyPrincipal;
return principal ?? new UnauthenticatedPrincipal(new GenericIdentity("Not Authenticated"));
}
}
谢谢你的帮助!