我正在使用HttpClient和HttpServer(In-Memory)运行集成测试。
当测试运行时,会执行一个令牌处理程序(消息处理程序),我只是为了快速测试而添加此代码:
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// other code removed for brevity...
var principal1 = CreatePrincipal(1, "test");
Thread.CurrentPrincipal = principal1;
return await base.SendAsync(request, cancellationToken);
}
[Authorize]
[HttpGet]
public HttpResponseMessage Get(int id)
{
return Request.CreateResponse(HttpStatusCode.OK, _service.Get(id));
}
当我调试动作的控制器构造函数时,我执行base.User.Identity.IsAuthenticated并将其设置为TRUE。
我原本预计会运行该操作,因为已设置Thread.CurrentPrincipal。
为什么不起作用?
答案 0 :(得分:2)
Web API v2中不推荐使用Thread.CurrentPrincipal。使用HttpRequestMessage.GetRequestContext()。Principal(设置和获取)
答案 1 :(得分:1)
每当您设置Thread.CurrentPrincipal
时,您也应设置HttpContext.User
。
Hanselman有一个blog post on the subject,this SO answer也涵盖了this SO answer。另请注意,您可能需要强制async
收益,如{{3}}。