Авторизация веб-API ASP.NET с авторизованным атрибутом

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

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

Это не работает должным образом. При запросе ресурса вы перенаправляетесь на форму входа. Это не очень подходит для веб-сайта RESTful.

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

Ответ 1

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

Ответ 2

Установите режим проверки подлинности на Нет:

<authentication mode="None" />

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

ASP.NET 5 Внедрена новая система поддержки Microsoft.AspNet.Authorization, которая может защитить и MVC и веб-API-контроллеры.

Подробнее см. мой ответ.

Update:

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

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

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

.NET standard

Ответ 6

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

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

Ответ 7

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

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

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

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

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

Упс...