ASP.NET Web API Авторизация с AuthorizeAttribute - PullRequest
59 голосов
/ 02 марта 2012

Использование новой бета-версии ASP.NET Web API.Я не могу заставить предложенный метод аутентификации пользователей работать.Там, где предложенный подход кажется, добавить фильтр [Authorize] к контроллерам API.Например:

[Authorize] 
public IEnumerable<Item> Get()
{
    return itemsService.GetItems();
}

Это не работает, как задумано.При запросе ресурса вы перенаправляетесь на форму авторизации.Что не очень подходит для RESTful вебапи.

Как мне поступить с этим?Будет ли это работать по-другому в будущих версиях? Или я должен вернуться к реализации собственного фильтра действий?

Ответы [ 8 ]

93 голосов
/ 03 марта 2012

Дважды проверьте, что вы используете System.Web.Http.AuthorizeAttribute, а не System.Web.Mvc.AuthorizeAttribute.Это укусило меня раньше.Я знаю, что команда WebAPI пытается собрать все воедино, чтобы она была знакома пользователям MVC, но я думаю, что некоторые вещи бесполезны.

4 голосов
/ 02 марта 2012

Установите режим аутентификации на Нет :

<authentication mode="None" />

Нет Не указывает аутентификацию.Ваше приложение ожидает только анонимных пользователей, или приложение предоставляет свою собственную аутентификацию.

http://msdn.microsoft.com/en-us/library/532aee0e.aspx

Конечно, тогда вы должны предоставить какую-то аутентификацию через заголовки или токены или что-то еще.Вы также можете указать Windows и использовать встроенную аутентификацию через заголовки.

Если этот сайт смешан между API и реальными страницами, для которых требуется параметр Forms , товам нужно будет написать свою собственную обработку.

Все, что делает атрибут, это возвращает экземпляр HttpUnauthorizedResult, перенаправление выполняется вне атрибута, так что это не проблема, это ваш поставщик аутентификации.

3 голосов
/ 14 марта 2012

Наконец, я нашел решение по адресу: ASP.NET MVC 4 WebAPI-авторизация

В этой статье показано, как можно решить эту проблему.

2 голосов
/ 21 мая 2012

Вы перенаправлены на страницу входа, потому что модуль проверки подлинности с помощью форм делает это автоматически.Чтобы избавиться от этого поведения, отключите проверку подлинности форм, как это было предложено Полом.Если вы хотите использовать более дружественный подход к REST, вам следует рассмотреть возможность реализации поддержки HTTP-авторизации.Посмотрите на это сообщение в блоге http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/

1 голос
/ 15 февраля 2016

ASP.NET 5 Представлена ​​новая Microsoft.AspNet.Authorization Система, которая может защитить и контроллеры MVC и Web API.

Подробнее см. Мой соответствующий ответ здесь.

Обновление:

В то время 2 года назад это был Microsoft.AspNetCore.Authorization.

Как заметил @Chris Haines. теперь он находится на Microsoft.AspNetCore.Authorization.

С .NET core 1.0 до 2.0, я думаю, было перемещено много пространств имен. И распространять функциональность между .net classic и core было неясно. Вот почему Microsoft ввела стандарт .net.

.net стандарт

0 голосов
/ 28 мая 2018
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Produces("application/json")]
[Route("api/[controller]")]
public class CitiesController : Controller
{
        [HttpGet("[action]")]
        public IActionResult Get(long cityId) => Ok(Mapper.Map<City, CityDTO>(director.UnitOfWork.Cities.Get(cityId)));
}

Используйте

[Авторизация (AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

Фильтр с типом аутентификации

0 голосов
/ 23 ноября 2015

Если вы используете роль, убедитесь, что она написана правильно:

Если ваша роль называется «Администратор», то это, например, не будет работать:

    [System.Web.Http.Authorize(Roles = "Administator")]

Также не будет это:

    [System.Web.Http.Authorize(Roles = "Administrators")]

Упс ...

0 голосов
/ 20 мая 2013

Кроме того, посмотрите на мой ответ для: Как защитить веб-API ASP.NET

Я создал пакет NuGet, который вы можете использовать для удобства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...