【问题标题】:Authorize filter returns 401 although the Thread.CurrentPrinicipal is set尽管设置了 Thread.CurrentPrincipal,但授权过滤器返回 401
【发布时间】:2014-02-26 05:48:28
【问题描述】:

我正在使用 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));
}

当我调试操作的控制器构造函数时,我会执行 base.User.Identity.IsAuthenticated 并将其设置为 TRUE。

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

为什么它不起作用?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 正确的是:HttpRequestMessage.GetUserPrincipal()/SetUserPrincipal(user)。今晚我会在家里测试它。
    • 使用 RequestContext 是一般的方法——你可能已经发现了一个捷径——但这并不能使它更正确;)
    • 好的,然后我找到了一种方便的方法 ;-) 但我更喜欢你的方法,因为方便的东西需要添加另一个组件......好的,你的解决方案刚刚在办公室测试,无法抗拒:p跨度>
    【解决方案2】:

    当你设置Thread.CurrentPrincipal时,你也应该设置HttpContext.User

    Hanselman 有一个 blog post on the subject,它也包含在 this SO answer 中。另请注意,您可能需要强制 async 屈服,如 this SO answer 中所述。

    【讨论】:

    • 我知道我应该正确设置 HttpContext.Current.User ;-) 但是这里不参与集成(内存中)测试 IIS 服务器,因此我的 HttpContext.Current 始终为空。这里没有什么可设置的...
    • 您的第一个链接是关于 FormsAuth 的,我不这样做。我正在运行 .NET 4.5.1,其中包括 UserTaskFriendlySynchronizationContext。
    猜你喜欢
    • 2017-09-20
    • 2022-08-17
    • 2016-05-22
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2020-11-26
    • 2015-12-25
    • 2021-10-22
    相关资源
    最近更新 更多