【问题标题】:How to insert/inject a fake user (IPrincipal)如何插入/注入假用户(IPrincipal)
【发布时间】:2012-11-09 14:22:27
【问题描述】:

我们需要在新项目上使用 Windows 身份验证。因此,我们将在动作方法上使用 AuthorizeAttribute,也许还会在有限数量的控制器动作中使用。

当然很好用。但要对此进行测试(无论是在单元测试中,还是在我集成这些东西时进行手动测试),我需要能够模拟具有任何角色的用户,并在不同角色之间频繁地来回切换。

我无法修改控制器的 User 对象(它是只读的),所以我可以从哪里插入一个实现 IPrincipal 的假用户,以便在我的应用程序的任何地方访问,包括:

  • 在控制器动作中
  • 在自定义属性中

我还没有深入研究 DI 框架——此时是否需要一个?如果你强烈推荐,我仍然想知道如何通过“穷人”的 DI 来做到这一点。

【问题讨论】:

标签: asp.net-mvc dependency-injection windows-authentication


【解决方案1】:

global.asax/Application_PostAuthenticateRequest(object sender, EventArgs e)

在 ASP.NET 对主体感到满意后调用该方法。

如果您只想提供自己的角色,您可以直接实现 RoleProvider

更新

你可以这样做:

public void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
    var principal = LoadFromTheDb();
    HttpContext.Current.User = Thread.CurrentPrincipal = principal;
}

然后你可以在任何你喜欢的地方使用该主体。

如果您在 web.config 中启用了runAllManagedModulesForAllRequests,您可能应该先检查用户是否经过身份验证,然后再执行其他操作。

【讨论】:

  • 您能详细说明一下吗?我可以从这里设置 HttpContext 的 User 属性吗(我不知道怎么做)?另外:此事件对 MVC 有效,还是仅对 Web 表单有效?
  • 不知道为什么,但 Application_OnPostAuthenticate() 不起作用。但是我可以在 Application_Start() 中设置用户,当然,它也在 global.asax 中,就足够了。
  • 那不行,无论谁登录,用户永远都是一样的。
  • 奥普斯。名称应为Application_PostAuthenticateRequest。在其中设置断点进行验证。
  • 谢谢——现在可以了。当然比 application_start() 更好。