我有一个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可以被欺骗,那么查看请求的方法可能会打开后门等等,这就是我想要确定的。如果我实现这一点的方式不是解决此需求的正确方法,我只是不想将我的其他方法暴露给漏洞。
答案 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不需要任何经过身份验证的用户。关于您的问题,使用不需要身份验证的操作没有任何问题。