尽管设置了Thread.CurrentPrinicipal,但授权过滤器返回401

时间:2014-02-02 20:05:33

标签: web asp.net-web-api asp.net-web-api2 asp.net-authorization

我正在使用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。

为什么不起作用?

2 个答案:

答案 0 :(得分:2)

Web API v2中不推荐使用Thread.CurrentPrincipal。使用HttpRequestMessage.GetRequestContext()。Principal(设置和获取)

答案 1 :(得分:1)

每当您设置Thread.CurrentPrincipal时,您也应设置HttpContext.User

Hanselman有一个blog post on the subjectthis SO answer也涵盖了this SO answer。另请注意,您可能需要强制async收益,如{{3}}。

中所述