ASP.NET авторизация Web API с атрибутом AuthorizeAttribute



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



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


это не работает, как будто задумано. При запросе ресурса вы перенаправляетесь на форму входа в систему. Что не очень подходит для спокойного webapi.



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

591   8  

8 ответов:

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

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

<authentication mode="None" />

нет указывает на отсутствие проверки подлинности. Приложение ожидает только анонимных пользователей или предоставляет собственную проверку подлинности.

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

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

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

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

наконец, я нашел решение в: ASP.NET MVC 4 WebAPI authorization

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

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

ASP.NET 5 представил новый Microsoft.сеть САШ.Авторизация система, которая может обеспечить и контроллеры MVC и Web API.

Подробнее см. Мой связанный ответ здесь.

обновление:

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

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

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

.net standard

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

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

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

Если ваша роль называется "администратор", то это, например, не получится :

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

и это не будет:

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

Упс...

[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)));
}

использовать

[Authorize (AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

фильтр с типом проверки подлинности

Comments

    Ничего не найдено.