Самый простой способ добавить базовую аутентификацию в web.config с помощью user / pass

Я настраиваю Azure API Management с приложением ASP.NET WebApi 2 за ним. Управление API рекомендует настроить базовую аутентификацию между прокси управления API и ASP.NET WebApi, чтобы убедиться, что WebApi доступен только через прокси управления API.

(Конечно, токены OAuth по-прежнему будут отправляться с запросами на «настоящую» аутентификацию, но я добавлю это позже.)

Имея это в виду, я действительно не хочу реализовывать базовую аутентификацию в приложении, я хотел бы, чтобы она обрабатывалась исключительно IIS через Web.config.

Вопрос: Как я могу настроить свой Web.config для выполнения базовой аутентификации с именем пользователя и паролем, хранящимся в Web.config?

Что я пробовал:

Я пытался следовать этой статье Применить правила аутентификации и авторизации ASP.NET к статическому содержимому с помощью IIS 7.0 интегрированная функция конвейера, но не очень повезло.

На этот вопрос нет ответа, но они, вероятно, просят аналогичную вещь: web.config однопользовательская базовая аутентификация

Другие ответы, которые я нашел здесь, включают добавление аутентификации внутри приложения, чего я не хочу делать.

Вот мой Web.config:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
  </configSections>
  <appSettings configSource="bin\debug-appSettings.config"/>
  <connectionStrings configSource="bin\debug-connectionStrings.config"/>
  <system.web>
    <compilation targetFramework="4.5.2"/>
    <httpRuntime targetFramework="4.5.2"/>
    <authentication mode="Forms">
      <forms>
        <credentials passwordFormat="Clear">
          <user name="test" password="test" />
        </credentials>
      </forms>
    </authentication>
    <authorization>
      <allow users="test" />
      <deny users="*" />
    </authorization>
  </system.web>
  <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
      <remove name="OPTIONSVerbHandler"/>
      <remove name="TRACEVerbHandler"/>
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
    </handlers>
    <modules>
      <remove name="FormsAuthenticationModule" />
      <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" />
      <remove name="UrlAuthorization" />
      <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
    </modules>
    <security>
      <authentication>
        <basicAuthentication enabled="true" />
      </authentication>
    </security>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Azure.AppService.ApiApps.Service" publicKeyToken="31BF3856AD364E35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-0.9.64.0" newVersion="0.9.64.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed"/>
        <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="MiniProfiler" publicKeyToken="b44f9351044011a3" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-3.2.0.157" newVersion="3.2.0.157"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-4.0.20622.1351" newVersion="4.0.20622.1351"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.WindowsAzure.Storage" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-6.1.0.0" newVersion="6.1.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb"/>
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
    </providers>
  </entityFramework>
</configuration>

Я отправляю запрос через PostMan со следующими заголовками:

Authorization: Basic dGVzdDp0ZXN0
Content-Type: application/json

Но все, что я получаю, это страница 401.1 от IIS.

Снимок экрана IIS

Что мне не хватает?


person Adam Szabo    schedule 28.11.2015    source источник
comment
Forms Auth и Basic Auth - это разные вещи. Если вы выполняете базовую аутентификацию с помощью IIS, вам необходимо создать учетную запись Windows с именем пользователя и паролем. И вам нужно будет использовать https для вашего API. Вы также можете использовать приложение Azure API и сделать API частным.   -  person Darrel Miller    schedule 30.11.2015
comment
Надеюсь, это видео немного поможет: channel9.msdn.com/Blogs/AzureApiMgmt/Last -mile-Security   -  person Miao Jiang    schedule 01.12.2015
comment
Базовая аутентификация - это определенный термин, при котором браузер будет отображать собственные поле с запросом имени пользователя и пароля, и данные учетные данные будут проверены на учетных записях пользователей Windows на сервере Windows. Это поведение указано в tools.ietf.org/html/rfc7617. Вы спрашиваете обычную аутентификацию.   -  person Gqqnbig    schedule 13.02.2018


Ответы (1)


В итоге я реализовал BasicAuthentication как HttpModule. Я дополню этот ответ подробностями позже.

Изменить:

Пакет NuGet: https://www.nuget.org/packages/Hexasoft.BasicAuthentication

Источник: https://github.com/hexasoftuk/Hexasoft.BasicAuthentication

person Adam Szabo    schedule 29.11.2015
comment
Как мне установить его на свой сервер IIS, чтобы использовать все веб-сайты? Есть команда Nuget, которая устанавливается там, где она выполняется? Как я могу использовать его с Powershell для установки в IIS? - person BananaAcid; 28.07.2018
comment
Надеюсь, никаких изменений IIS не требуется. в этом весь смысл. - person Christian; 30.01.2020