Web 尽管设置了Thread.CurrentPrinicipal,授权筛选器仍返回401

Web 尽管设置了Thread.CurrentPrinicipal,授权筛选器仍返回401,web,asp.net-web-api,asp.net-web-api2,asp.net-authorization,Web,Asp.net Web Api,Asp.net Web Api2,Asp.net Authorization,我正在运行与HttpClient和HttpServer(内存中)的集成测试 测试运行时,将执行令牌处理程序(消息处理程序),其中我添加以下代码只是为了快速测试: protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // other code removed for b

我正在运行与HttpClient和HttpServer(内存中)的集成测试

测试运行时,将执行令牌处理程序(消息处理程序),其中我添加以下代码只是为了快速测试:

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));
}
受保护的异步覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
//为简洁起见,删除了其他代码。。。
var principal1=CreatePrincipal(1,“测试”);
Thread.CurrentPrincipal=principal1;
返回wait base.sendaync(请求、取消令牌);
}
[授权]
[HttpGet]
公共HttpResponseMessage获取(int id)
{
返回Request.CreateResponse(HttpStatusCode.OK,_service.Get(id));
}
当我调试到动作的控制器构造函数中时,我会执行base.User.Identity.IsAuthenticated并将其设置为TRUE

我本以为操作会运行,因为设置了Thread.CurrentPrincipal


为什么它不工作?

无论何时设置
Thread.CurrentPrincipal
,都应该设置
HttpContext.User


Hanselman有一本书,书中也有。还请注意,您可能需要强制执行
异步
屈服,如中所述。

Thread.CurrentPrincipal在Web API v2中已被弃用。使用HttpRequestMessage.GetRequestContext().Principal(设置和获取)

我知道应该正确设置HttpContext.Current.User;-)但是进行集成(内存中)测试IIS服务器在这里没有参与,因此我的HttpContext.Current始终为空。这里没有要设置的内容…你的第一个链接是关于FormsAuth的,我没有。我正在运行.NET 4.5.1,其中包括UserTaskFriendlySynchronizationContext。正确地说,它是:HttpRequestMessage.GetUserPrincipal()/SetUserPrincipal(用户)。今晚我会在家里测试它。使用RequestContext是一般的方法——你可能已经发现了一个快捷方式——但这并不能使它更正确;)好的,然后我找到了一个方便的方法;-)但我更喜欢你的方法,因为传统的东西需要另外添加一个组件。。。好的,你的解决方案刚刚在办公室测试过,无法抗拒:p