У меня есть контроллер 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);
}
Если я удалю один из этих параметров за раз, в обоих случаях, когда неавторизованный пользователь вызывает контроллер, он возвращает запретный ответ. Какая разница между этими двумя вариантами и там, которая лучше, чем другая?
Благодарю.
С помощью атрибута [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, вам просто нужно изменить в одном классе, а не на всех своих веб-апитах, как показано ниже:
[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;
}
}
}
}