【问题标题】:WebApiDoodle BasicAuthenticationHandler and WebApi 4 not Allowing AnonymousWebApiDoodle BasicAuthenticationHandler 和 WebApi 4 不允许匿名
【发布时间】:2013-04-13 06:43:21
【问题描述】:

这是一个 .NET 4.5 C# MVC + WebAPI 4 项目。我正在使用 WebApiDoodle 2.0.1 BasicAuthenticationHandler 来使用 MVC + WebAPI 并排安全性,如 here 所述。

在我的应用程序启动中添加消息处理程序:

globalConfig.MessageHandlers.Add(new {MyClass Derived from BasicAuthenticationHandler}());

MVC 控制器工作正常(从System.Web.Mvc.Controller 派生的类)。

但是,WebApi 控制器(派生自 System.Web.Http.ApiController)忽略 System.Web.Http.AllowAnonymous 属性。他们基本上想要验证/授权一切。

如果我从 globalConfig 中删除自定义消息处理程序,WebAPI 将按预期工作,AllowAnonymous 属性允许提供匿名请求(并且具有 [Authorize] 的操作被拒绝)。

任何想法可能会发生什么?谢谢。

【问题讨论】:

    标签: c# asp.net-web-api


    【解决方案1】:

    这看起来像是 MessageHandler 中的一个错误

    https://github.com/WebAPIDoodle/WebAPIDoodle/blob/dev/src/WebApiDoodle.Web/MessageHandlers/BasicAuthenticationHandler.cs

    如果 Authorization 标头为空,它会返回一个质询 (www-challenge),因此它永远不会调用 Web API。只有当 web api 方法因为需要授权而无法执行时,才应返回质询。它应该有这样的东西,

        return base.SendAsync(request, cancellationToken)
    .ContinueWith<HttpResponseMessage>(r =>
    {
      if (r.Result.StatusCode == HttpStatusCode.Unauthorized)
      {
        return HandleUnauthenticatedRequestImpl(request, cancellationToken);
      }
    
      return r.Result;
    }); 
    

    询问项目所有者是否可以修复处理程序。

    【讨论】:

    【解决方案2】:

    在与 WebApiDoodle 的开发者讨论后,他提出了一种不同的方法。

    您可以在此处查看讨论的详细信息:https://github.com/WebAPIDoodle/WebAPIDoodle/pull/8

    无论如何,开发者的重要部分:

    AllowAnonymousAttribute 内部没有逻辑。 AuthorizeAttribute 尊重它。在我个人看来,如果 API 需要身份验证,每个用户都应该对 API 进行身份验证。这就是为什么您将此视为默认行为。但是,修复很容易。只需覆盖 HandleUnauthenticatedRequest 方法并将其保留为空。然后,像您所做的那样,将质询请求作为延续添加到处理程序的 SendAsync 方法中。

    【讨论】:

      猜你喜欢
      • 2014-09-22
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 2014-09-02
      • 2015-02-09
      • 1970-01-01
      • 2015-10-09
      相关资源
      最近更新 更多