我的处理程序绕过某些API方法的安全性是否有任何重大漏洞?

时间:2013-03-27 18:26:53

标签: security asp.net-web-api

我有一个Web API服务,其中包含所有需要安全性的方法,这些方法通过使用以下内容在CustomAuthenticationHandler处理程序中实现的逻辑进行处理:

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    //Security Logic

    //Return Task
}

但是我有一个我希望公开曝光的方法 not 需要安全性。我试图阻止为这一方法提供单独的服务,我不需要任何安全信息。以下是我如何做到这一点,它的工作原理

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{

  if (request.RequestUri.AbsolutePath == "/api/MyPublicNoSecurityNeededMethod")
       return base.SendAsync(request, cancellationToken).ContinueWith(task => task.Result);

    //Security Logic

    //Return Task
}

因此,我基本上提前返回,并且永远不会通过安全逻辑。我想知道这种方法是否有任何问题,或者是否有更安全的方法来处理这种需求?如果答案是URL可以被欺骗,那么查看请求的方法可能会打开后门等等,这就是我想要确定的。如果我实现这一点的方式不是解决此需求的正确方法,我只是不想将我的其他方法暴露给漏洞。

1 个答案:

答案 0 :(得分:1)

您使用HttpMessageHandler是不正确的。处理程序应该只验证客户端并在Thread.CurrentPrincipal中设置当前主体,如果Web Api在ASP.NET中托管,则可选地在HttpContext.Current.User中设置。然后,框架提供可用于定义操作的授权规则的属性,例如[AuthorizeAttribute]和[AllowAnonymous]属性。这些属性依赖于当前主体来执行授权。

public class HelloWorldController : ApiController
    {
        [Authorize]
        public string Get()
        {
            return "hello " + User.Identity.Name;
        }
    }

    public class HelloWorldAnonymousController : ApiController
    {
        [AllowAnonymous]
        public string Get()
        {
            return "hello anonymous";
        }
    }

Authorize指定操作需要经过身份验证的用户。 AllowAnonymous不需要任何经过身份验证的用户。关于您的问题,使用不需要身份验证的操作没有任何问题。