【问题标题】:How to do ASP.NET Web API integration tests with custom authentication and in-memory hosting如何使用自定义身份验证和内存托管进行 ASP.NET Web API 集成测试
【发布时间】:2014-03-28 14:42:46
【问题描述】:

here 已经回答了一个类似的问题,但答案似乎不适用于我的情况。

我想在使用 JWT 身份验证的 Web Api 中测试身份验证/授权过程。

我的身份验证是通过我添加到我的HttpConfiguration 的自定义MessageHandler 处理的。授权由我想限制访问的控制器/方法上的简单 [Authorize] 属性处理。

我正在设置身份验证期间以这种方式从令牌中提取的主体(在我的自定义 MessageHandler 中):

Thread.CurrentPrincipal = principal;

if (HttpContext.Current != null)
{
     HttpContext.Current.User = principal;
}

当我在本地 IIS 中手动测试时,整个过程运行良好。

但是当使用像 here 这样的内存托管进行测试时 存储用于使用[Authorize] 进行授权的主体的ApiController.User 属性在我的调用测试(我当前会话的Windows 主体)中获取Thread.CurrentPrincipal,而不是身份验证期间的一组。 如果我将 Thread.CurrentPrincipal 设置为 null,我只会收到错误的请求。

TL;DR 如何使用内存托管测试我的身份验证/授权管道 ?因为它在我的测试中将ApiController.User 值设置为Thread.CurrentPrincipal 值,并且没有获得我在身份验证期间成功设置的值。

我想我可以设法通过实现自定义[Authorize] 属性来获得Thread.CurrentPrincipal 而不是ApiController.User,但我想避免这种情况。

提前致谢。

EDIT 进行澄清:所有这些管道(身份验证然后授权)在运行的 IIS 中运行良好(在内存托管期间,HttpContext 为空)。我只是想在内存托管中测试它(如果可能的话)。在使用内存托管进行测试期间,在我的自定义MessageHandler 中放置断点,我可以看出Thread.CurrentPrincipal 设置得很好,只是[Authorize] 似乎并不关心这一点,因为在我的ApiControllers 中@在我的测试(我的本地 Windows 会话主体)中,987654341@ 属性已设置为我的 Thread.CurrentPrincipal

【问题讨论】:

  • 您在这里使用的是哪个版本的 ASP.NET Web API?您可以发布验证请求的消息处理程序代码吗?
  • 我正在使用 ASP.NET Web API 2.1 和 here 你可以找到一个有点相似的消息处理程序来验证请求(110 我没有使用 PrincipalTransformer,而是分配我得到的委托人来自 tokenHandler.ValidateToken 直接)

标签: c# asp.net-web-api authorization integration-testing iprincipal


【解决方案1】:

我按照"Retrieving and Assigning the Current Principal" section of Chapter 15 in "Designing Evolvable Web APIs with ASP.NET" 中列出的指导取得了成功:

在 ASP.NET Web API 2.0 版中,您可以通过使用 新的 HttpRequestContext 类。一、当前身份应该 被检索并分配给当前请求对象,而不是 静态属性。其次,不同的主机可以使用不同的 HttpRequestContext 实现

简而言之,在您的消息处理程序中,这样做而不是设置当前线程和 HttpContext 的主体:

request.GetRequestContext().Principal = principal;

【讨论】:

  • 在寻找解决方案 2 天后,这对我有用。谢谢。
猜你喜欢
  • 2013-03-18
  • 2013-11-22
  • 2016-05-06
  • 2016-05-17
  • 1970-01-01
  • 2018-03-15
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多