如何使用自定义身份验证和内存中托管执行 ASP.NET Web API 集成测试

本文关键字:ASP 执行 NET Web 集成测试 API 自定义 何使用 身份验证 内存 | 更新日期: 2023-09-27 17:54:25

这里

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

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

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

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

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

当我在本地 IIS 中手动测试它时,整个过程工作正常。

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

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

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

提前谢谢。

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

如何使用自定义身份验证和内存中托管执行 ASP.NET Web API 集成测试

我成功地遵循了"使用 ASP.NET 设计可进化的 Web API"第 15 章的"检索和分配当前主体"部分中列出的指导:

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

简而言之,在消息处理程序中,执行此操作,而不是设置当前线程和 HttpContext 的主体:

request.GetRequestContext().Principal = principal;