Подтвердить что ты не робот

Отключить проверку подлинности Windows для WebAPI

Я играю с приложением MVC4 и использую WebAPI для извлечения/отправки всех моих данных. В контроллере я использую запрос HttpClient для получения данных, и все работает нормально. Проблема, с которой я сталкиваюсь, заключается в том, что когда в проекте включена проверка подлинности Windows, вызовы веб-API возвращают 401 Несанкционированную ошибку.

код в моем контроллере, который выполняет вызов:

using (var client = new HttpClient())
{
    var invoiceDetailUrl = BASE_URL + Url.HttpRouteUrl(
        "DefaultApi",
        new { controller = "InvoiceDetails", id = id }
     );

     var result = client.GetAsync(invoiceDetailUrl).Result; 

 }

Аутентификация Windows должна быть включена для сайта, но не обязательно для контроллеров веб-API. Я попытался исключить контроллеры API в файле web.config, как показано ниже:

<location path="api">
        <system.web>
            <authorization>
                <allow users="*"/>
        </authorization>
    </system.web>
</location>

но дополнения к web.config ничего не сделали.

Любые предложения?

4b9b3361

Ответ 1

Аутентификация

Web API предполагает, что аутентификация происходит на хосте. IIS использует HTTP-модули для аутентификации. Теперь asp.net позволяет вам настроить через web.config любой из модулей аутентификации, встроенных в IIS или ASP.NET, или написать собственный HTTP-модуль для выполнения пользовательской проверки подлинности.

enter image description here

Вы можете использовать несколько аутентификаций одновременно, это не проблема. В этом случае вам потребуется проверка подлинности Windows и анонимная аутентификация. Аутентификация Windows защитит ваш веб-сайт, и анонимная аутентификация откроет ваш веб-сайт Api.

Настройка проверки подлинности в IIS

Хостинг на IIS Express Откройте панель "Свойства" (через F4, а не свойства проекта) и примените требуемую аутентификацию Установите "Анонимная аутентификация" на "Отключено". Установите "Аутентификация Windows" на "Включено".

Хостинг на IIS 7 или более поздней версии В диспетчере IIS откройте функцию проверки подлинности в представлении функций. Включить/Отключить требуемую аутентификацию. Если система аутентификации не является опцией (например, Windows), вам необходимо установить ее через диспетчер сервера (Добавить службы ролей).

Авторизация

авторизация asp.net

В ASP.NET существует два способа авторизации доступа к данному ресурсу: авторизация файлов и URL. Я не буду объяснять это здесь, но вы можете прочитать эту статью .

Важно то, что вы можете разрешать/запрещать пользователям и/или группам в web.config.

Конфигурация по умолчанию для проверки подлинности Windows позволяет разрешать только пользователям аутентификации *****, например:

<authorization>
<deny users="?" ></deny>
</authorization>

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

<location path="api">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>

Разрешение веб-Api

asp.net Администрирование веб-Api происходит позже в конвейере, ближе к контроллеру. Это позволяет вам делать более подробный выбор при предоставлении доступа к ресурсам.

Web API предоставляет встроенный фильтр авторизации AuthorizeAttribute. Существует также AllowAnonymousAttribute. Вы можете использовать его глобально, на контроллере или на действии. По умолчанию разрешены все действия.

Тестирование Api

Через браузер

Интегрированная проверка подлинности Windows работает с любым браузером, поддерживающим схему проверки подлинности Negotiate. Это cas для Internet Explorer и теперь Chrome: они автоматически будут предоставлять учетные данные Windows при просмотре веб-сайта с помощью проверки подлинности Windows. Firefox не поддерживает эту схему, поэтому я часто проверяю аутентификацию с помощью этого браузера.

Через HttpClient Ваш HttpClient должен предоставлять учетные данные при вызове Web Api (например, в браузерах). Это делается путем настройки HttpClientHandler с соответствующими учетными данными.

//use default credentials aka Windows Credentials
HttpClientHandler handler = new HttpClientHandler()
{
    UseDefaultCredentials = true
};

//use username/password credentials
HttpClient client = new HttpClient(handler);

var handler = new HttpClientHandler {
    Credentials = new NetworkCredential(username, password)
};

var httpClient = new HttpClient(handler);

Надеюсь, это поможет вам.

В последнее время важно отметить, что ваш веб-сайт Api не позволяет анонимным пользователям вообще! Поскольку вы используете учетные данные по умолчанию в своем HttpClientHandler, это означает, что для вашей службы требуется проверка подлинности Windows. Вам не нужно настраивать учетные данные в открытой и общедоступной службе.

Ответ 2

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

У меня есть приложение MVC4, в котором есть часть WebAPI. Приложение MVC должно использовать Windows Auth, но часть WebAPI должна быть анонимной и отключена Windows Auth. Хотя вышеупомянутое решение работало для ncbl, оно не сработало для меня, потому что в моем сценарии я не использовал код для обработки учетных данных. В моем сценарии мне понадобилось решение web.config или IIS. Я начал с решения cybermaxs web.config и добавил к нему. Вот что у меня получилось.

<!-- Configure the virtual path api -->
<!-- This section is like a mini-web.config for the virtual path -->
<location path="api">
    <system.web>
        <authorization>
            <!-- All anonymous users access to the virtual path api -->
            <allow users="?" />
        </authorization>
    </system.web>
    <!-- Need to include the security overrides else it will inherit from the root of the application -->
    <system.webServer>
        <security>
            <authentication>
                <!-- Need to enable anonymous access and turn off Windows authentication for the virtual path -->
                <anonymousAuthentication enabled="true"/>
                <windowsAuthentication enabled="false"/>
            </authentication>
        </security>
    </system.webServer>
</location>

Ключом для меня было добавить раздел <system.webServer> в web.config, чтобы я мог переопределить аутентификацию для этого виртуального пути. Я попытался сделать это в IIS, но поскольку это был виртуальный путь, т.е. /Api не существует на веб-сервере, это было невозможно для меня.

Примечание. Помните, что IIS может иметь файл конфигурации на более высоком уровне конфигурации, который блокирует раздел <authentication>, например, в файле application.config или machine.config. У элемента может быть установлен атрибут allowOverride равным false. Сначала я получал ошибку HTTP 500.19 (HRESULT: 0x80070021) и должен был перейти в файл application.config, чтобы изменить этот атрибут. Я нашел более подробную информацию об этой ошибке здесь.

Как только у меня появился этот дополнительный раздел в разделе <location> моего web.config, я удостоверился, что украсил мой контроллер api [AllowAnonymous]. Тогда бам... все это начало работать.

Вот как я установил аутентификацию и авторизацию для корня моего приложения.

<system.web>
  <authentication mode="Windows" />
  <authorization>
    <!-- Deny all anonymous users at the root of the application -->
    <deny users="?" />
  </authorization>
</system.web>

Ответ 3

Это то, что мне нужно было сделать:

<location path="api">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>