Защита WebAPI с атрибутом [Authorize] против User.Identiy.IsAuthenticated
У меня есть WebAPI
контроллер, который требует аутентификации пользователей, и я использую MS Identity 2.0 для аутентификации. Контроллер выглядит примерно так:
[Route("MyRoute")]
[Authorize]
[HttpPost]
public HttpResponseMessage Post([FromBody] string value)
{
if (User.Identity.IsAuthenticated == true)
{
....
}
else
{
return new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden);
}
Если я удаляю один из этих параметров одновременно, в обоих случаях, когда неавторизованный пользователь вызывает контроллер, он возвращает запрещенный ответ. В чем разница между этими двумя вариантами и тем, что один лучше другого?
Благодарю.
2 ответа
С [Authorize]
атрибут, логика авторизации может быть переопределена фильтрами и будет расположена в центральном месте в коде.
if (User.Identity.IsAuthenticated == true)
{
....
}
else
{
return new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden);
}
в основном такой же, как по умолчанию [Authorize]
функциональность, но вы будете повторять себя снова и снова.
Хотя техническая деталь, фильтры авторизации [Authorize]
выше в трубопроводе, поэтому Forbidden
будет более эффективным для вашего сервера.
см.: http://www.dotnet-tricks.com/Tutorial/mvc/LYHK270114-Detailed-ASP.NET-MVC-Pipeline.html
С помощью атрибута "Авторизировать" вы можете централизованно создать фильтр запросов для всех ваших запросов. его легко управлять. например, если вы хотите использовать другого провайдера аутентификации, такого как WebSecurity, вам просто нужно изменить один класс вместо всех ваших веб-API, как показано ниже:
[AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
base.OnAuthorization(actionContext);
////check authentication and return if not authorized
if (actionContext != null)
{
if (!WebSecurity.IsAuthenticated)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) { RequestMessage = actionContext.ControllerContext.Request };
return;
}
}
}
}