【发布时间】: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