Защита WebAPI с атрибутом [Authorize] против User.Identiy.IsAuthenticated

1

У меня есть контроллер 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);
  } 

Если я удалю один из этих параметров за раз, в обоих случаях, когда неавторизованный пользователь вызывает контроллер, он возвращает запретный ответ. Какая разница между этими двумя вариантами и там, которая лучше, чем другая?

Благодарю.

Теги:
asp.net-web-api
identity

2 ответа

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

1

По атрибуту "Авторизовать" вы можете централизованно создать свой фильтр запросов для всего вашего запроса. его легко управлять. например, если вы хотите использовать другой провайдер аутентификации, такой как 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;
                }             

            }
        }
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню