WebApi Doodle基本身份验证处理程序和Web Api 4不允许匿名

wmagni 发布于 2019-03-09 c# 最后更新 2019-03-09 14:31 4 浏览

这是一个.NET 4.5 C#MVC + WebAPI 4项目。我正在使用WebApiDoodle 2.0.1 BasicAuthenticationHandler以解释here的方式使用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]的操作被拒绝)。 任何想法可能发生什么?谢谢。
已邀请:

hquae

赞同来自:

它看起来像MessageHandler中的一个错误 https://github.com/WebAPIDoodle/WebAPIDoodle/blob/dev/src/WebApiDoodle.Web/MessageHandlers/BasicAuthenticationHandler.cs 如果Authorization标头为null,则它返回一个质询(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;
}); 
询问项目所有者是否可以修复处理程序。

ysunt

赞同来自:

在与WebApiDoodle开发人员讨论后,他提出了一种不同的方法。 您可以在此处查看讨论的详细信息:https://github.com/WebAPIDoodle/WebAPIDoodle/pull/8 无论如何,开发人员的重要部分:

AllowAnonymousAttribute has no logic inside it. AuthorizeAttribute honors it. In my personal opinion, every user should authenticate to an API if that API needs authentication. That's why u see this as the default behavior. However, the fix is easy. Just override HandleUnauthenticatedRequest method and keep it empty. Then, add the challenge request as a continuation to your handler's SendAsync method just like you did.