0

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

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

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] 的操作被拒绝)。

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

4

2 回答 2

0

它看起来像那个 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;
}); 

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

于 2013-04-11T18:39:31.457 回答
0

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

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

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

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

于 2013-04-12T22:43:21.523 回答