1

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

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

    //Return Task
}

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

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 可以被欺骗,那么这种查看请求的方法可能会打开一个后门,等等。这就是我想要确定的。如果我实现此方法的方式不是解决此需求的正确方法,我只是不想将我的其他方法暴露给漏洞。

4

1 回答 1

1

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

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 不需要任何经过身份验证的用户。关于您的问题,不需要身份验证的操作没有错。

于 2013-03-27T20:04:09.980 回答