Настройка проверки подлинности Windows в ASP.NET Core

Автор: Скотт Адди (Scott Addie)

Проверка подлинности Windows (также известная как согласование, Kerberos или проверка подлинности NTLM) может быть настроена для ASP.NET Core приложений, размещенных в IIS, Kestrelили HTTP.sys.

Проверка подлинности Windows (также известная как Negotiate, Kerberos или NTLM) может быть настроена для ASP.NET Core приложений, размещенных в IIS или HTTP.sys.

Проверка подлинности Windows полагается на операционную систему для проверки подлинности пользователей ASP.NET Core приложений. Проверку подлинности Windows можно использовать, когда сервер работает в корпоративной сети, используя удостоверения домена Active Directory или учетные записи Windows для идентификации пользователей. Проверка подлинности Windows лучше всего подходит для сред интрасети, где пользователи, клиентские приложения и веб-серверы принадлежат одному и тому же домену Windows.

Примечание

Проверка подлинности Windows не поддерживается HTTP/2. Проблемы проверки подлинности могут отправляться в ответах HTTP/2, но перед проверкой подлинности клиент должен перейти на HTTP/1.1.

Сценарии прокси-сервера и подсистемы балансировки нагрузки

Проверка подлинности Windows — это сценарий с отслеживанием состояния, который в основном используется в интрасети, где прокси-сервер или балансировщик нагрузки обычно не обрабатывал трафик между клиентами и серверами. Если используется прокси-сервер или балансировщик нагрузки, проверка подлинности Windows работает только в том случае, если прокси-сервер или балансировщик нагрузки:

  • Обрабатывает проверку подлинности.
  • Передает сведения о проверке подлинности пользователя в приложение (например, в заголовке запроса), которое действует на данные проверки подлинности.

Альтернативой проверки подлинности Windows в средах, где используются прокси-серверы и подсистемы балансировки нагрузки, — Active Directory Федеративные службы (ADFS) с OpenID Connect Connect (OIDC).

IIS/IIS Express

Добавьте службы проверки подлинности, вызвав AddAuthentication ( Microsoft.AspNetCore.Server.IISIntegration пространство имен) в Startup.ConfigureServices :

services.AddAuthentication(IISDefaults.AuthenticationScheme);

Параметры запуска (отладчик)

Настройка параметров запуска влияет только на Свойства и launchSettings.jsв файле для IIS Express и не НАСТРАИВАЕТ службы IIS для проверки подлинности Windows. Конфигурация сервера описывается в разделе IIS .

Шаблон веб-приложения , доступный через Visual Studio или .NET Core CLI можно настроить для поддержки проверки подлинности Windows, который автоматически обновляет Свойства и launchSettings.jsв файле.

Новый проект

  1. Создайте новый проект.
  2. Выберите Новое веб-приложение ASP.NET Core. Выберите Далее.
  3. Введите имя в поле имя проекта . Убедитесь, что для проекта правильно указано существующее расположение или укажите новое. Нажмите кнопку создания.
  4. В разделе Проверка подлинностивыберите изменить .
  5. В окне Изменение проверки подлинности выберите Проверка подлинности Windows. Щелкните ОК.
  6. Выберите Веб-приложение.
  7. Нажмите кнопку создания.

Запустите приложение. Имя пользователя отображается в пользовательском интерфейсе отображаемого приложения.

Существующий проект

Свойства проекта включают проверку подлинности Windows и отключение анонимной проверки подлинности:

  1. В обозревателе решений щелкните проект правой кнопкой мыши и выберите пункт Свойства.
  2. Выберите вкладку Отладка.
  3. Снимите флажок включить анонимную проверку подлинности.
  4. Установите флажок включить проверку подлинности Windows.
  5. Сохраните и закройте страницу свойств.

Кроме того, свойства можно настроить в iisSettings узле launchSettings.jsв файле:

"iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    "iisExpress": {
        "applicationUrl": "http://localhost:52171/",
        "sslPort": 44308
    }
}

При изменении существующего проекта убедитесь, что файл проекта содержит ссылку на пакет для пакета NuGet Microsoft. AspNetCore. app метапакет или Microsoft. AspNetCore. Authentication .

IIS

Службы IIS используют модуль ASP.NET Core для размещения ASP.NET Core приложений. Проверка подлинности Windows настраивается для служб IIS с помощью файла web.config . В следующих разделах показано, как выполнить следующие задачи:

  • Укажите локальный файл web.config , который активирует проверку подлинности Windows на сервере при развертывании приложения.
  • Используйте диспетчер служб IIS для настройки файла web.config ASP.NET Core приложения, которое уже развернуто на сервере.

Если вы еще не сделали этого, включите IIS для размещения ASP.NET Core приложений. Для получения дополнительной информации см. Размещение ASP.NET Core в Windows со службами IIS.

Включите службу роли IIS для проверки подлинности Windows. Дополнительные сведения см. в разделе Включение проверки подлинности Windows в службах РОЛЕЙ IIS (см. шаг 2).

По умолчанию по промежуточного слоя интеграции IIS настроено на автоматическую проверку подлинности запросов. Дополнительные сведения см. в разделе Host ASP.NET Core в Windows с IIS: параметры IIS (аутоматикаусентикатион).

Модуль ASP.NET Core настроен на пересылку маркера проверки подлинности Windows в приложение по умолчанию. Дополнительные сведения см. в разделе Справочник по конфигурации модуля ASP.NET Core: атрибуты элемента aspNetCore.

Используйте один из следующих подходов:

  • Перед публикацией и развертыванием проекта добавьте следующий файл web.config в корневой каталог проекта:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <location path="." inheritInChildApplications="false">
        <system.webServer>
          <security>
            <authentication>
              <anonymousAuthentication enabled="false" />
              <windowsAuthentication enabled="true" />
            </authentication>
          </security>
        </system.webServer>
      </location>
    </configuration>
    

    Когда проект публикуется пакет SDK для .NET Core (без <IsTransformWebConfigDisabled> свойства, установленного true в файле проекта), опубликованный файл web.config включает <location><system.webServer><security><authentication> раздел. Дополнительные сведения о <IsTransformWebConfigDisabled> свойстве см. в разделе Размещение ASP.NET Core в Windows со службами IIS .

  • После публикации и развертывания проекта выполните настройку на стороне сервера с помощью диспетчера IIS.

    1. В диспетчере служб IIS выберите сайт IIS в узле сайты на боковой панели подключения .
    2. Дважды щелкните Проверка подлинности в области IIS .
    3. Выберите Анонимная проверка подлинности. На боковой панели действия выберите Отключить .
    4. Выберите параметр Проверка подлинности Windows. Выберите включить на боковой панели действия .

    Когда выполняются эти действия, Диспетчер IIS изменяет файл web.config приложения. <system.webServer><security><authentication>Узел добавляется с обновленными параметрами для anonymousAuthentication и windowsAuthentication :

    <system.webServer>
      <security>
        <authentication>
          <anonymousAuthentication enabled="false" />
          <windowsAuthentication enabled="true" />
        </authentication>
      </security>
    </system.webServer>
    

    <system.webServer>Раздел, добавленный в файл web.config диспетчером IIS, находится за пределами раздела приложения, <location> добавленного пакет SDK для .NET Core при публикации приложения. Так как раздел добавляется за пределы <location> узла, параметры наследуются любыми вложенными приложениями для текущего приложения. Чтобы предотвратить наследование, переместите добавленный <security> раздел в <location><system.webServer> раздел, указанный пакет SDK для .NET Core.

    Когда диспетчер IIS используется для добавления конфигурации IIS, он влияет только на файл web.config приложения на сервере. Последующее развертывание приложения может перезаписать параметры на сервере, если копия web.config сервера заменяется web.configным файлом проекта. Для управления параметрами используйте один из следующих подходов.

    • Используйте диспетчер IIS для сброса параметров в файле web.config после того, как файл будет перезаписан при развертывании.
    • Добавьте файлweb.config в приложение локально с параметрами.

Kestrel

Пакет NuGet Microsoft. AspNetCore. Authentication. Negotiate можно использовать с Kestrel для поддержки проверки подлинности Windows с помощью Negotiate и Kerberos в Windows, Linux и macOS.

Предупреждение

Учетные данные могут быть сохранены в запросах к соединению. Проверка подлинности Negotiate не должна использоваться с прокси, если только прокси-сервер не поддерживает сопоставление соединения 1:1 (постоянное подключение) с Kestrel.

Примечание

Обработчик согласования определяет, поддерживает ли базовый сервер встроенную проверку подлинности Windows и включен ли он. Если сервер поддерживает проверку подлинности Windows, но отключен, выдается сообщение об ошибке, предлагающее включить серверную реализацию. Если на сервере включена проверка подлинности Windows, обработчик согласования прозрачно пересылает его.

Добавьте службы проверки подлинности, вызвав AddAuthentication и AddNegotiate в Startup.ConfigureServices :

// using Microsoft.AspNetCore.Authentication.Negotiate;
// using Microsoft.Extensions.DependencyInjection;

services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
   .AddNegotiate();

Добавьте по промежуточного слоя проверки подлинности, вызвав UseAuthentication в Startup.Configure :

app.UseAuthentication();

Дополнительные сведения о по промежуточного слоя см. в разделе ПО промежуточного слоя ASP.NET Core .

Анонимные запросы разрешены. Используйте ASP.NET Coreную авторизацию для запроса анонимных запросов на проверку подлинности.

Конфигурация среды Windows

Компонент Microsoft. AspNetCore. Authentication. Negotiate выполняет проверку подлинности пользователя в пользовательском режиме. Имена участников-служб (SPN) должны быть добавлены в учетную запись пользователя, запускающего службу, а не в учетную запись компьютера. Выполните setspn -S HTTP/myservername.mydomain.com myuser команду в административной командной консоли.

Конфигурация среды Linux и macOS

Инструкции по присоединению компьютера Linux или macOS к домену Windows доступны в статье подключение Azure Data Studio к SQL Server с помощью проверки подлинности Windows — Kerberos . Эти инструкции создают учетную запись компьютера для компьютера Linux в домене. Имена участников-служб должны быть добавлены в эту учетную запись компьютера.

Примечание

При выполнении рекомендаций, приведенных в разделе подключение Azure Data Studio к SQL Server с помощью проверки подлинности Windows — Kerberos , замените python-software-properties на python3-software-properties при необходимости.

После присоединения компьютера Linux или macOS к домену необходимо выполнить дополнительные действия, чтобы предоставить keytab- файл с именами участников-служб:

  • На контроллере домена добавьте новые имена SPN веб-службы в учетную запись компьютера:
    • setspn -S HTTP/mywebservice.mydomain.com mymachine
    • setspn -S HTTP/mywebservice@MYDOMAIN.COM mymachine
  • Используйте ктпасс для создания файла keytab:
    • ktpass -princ HTTP/mywebservice.mydomain.com@MYDOMAIN.COM -pass myKeyTabFilePassword -mapuser MYDOMAIN\mymachine$ -pType KRB5_NT_PRINCIPAL -out c:\temp\mymachine.HTTP.keytab -crypto AES256-SHA1
    • Некоторые поля должны быть указаны в верхнем регистре, как указано.
  • Скопируйте файл keytab на компьютер Linux или macOS.
  • Выберите файл keytab с помощью переменной среды:export KRB5_KTNAME=/tmp/mymachine.HTTP.keytab
  • Вызовите klist , чтобы отобразить имена участников-служб, доступные в настоящее время для использования.

Примечание

Файл keytab содержит учетные данные доступа к домену и должен быть защищен соответствующим образом.

HTTP.sys

HTTP.sys поддерживает проверку подлинности Windows в режиме ядра с помощью Negotiate, NTLM или обычной проверки подлинности.

Добавьте службы проверки подлинности, вызвав AddAuthentication ( Microsoft.AspNetCore.Server.HttpSys пространство имен) в Startup.ConfigureServices :

services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);

Настройте веб-узел приложения для использования HTTP.sys с проверкой подлинности Windows (Program.CS). UseHttpSys находится в пространстве имен Microsoft.AspNetCore.Server.HttpSys.

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>()
                    .UseHttpSys(options =>
                    {
                        options.Authentication.Schemes = 
                            AuthenticationSchemes.NTLM | 
                            AuthenticationSchemes.Negotiate;
                        options.Authentication.AllowAnonymous = false;
                    });
            });
}
public class Program
{
    public static void Main(string[] args) => 
        BuildWebHost(args).Run();

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseHttpSys(options =>
            {
                options.Authentication.Schemes = 
                    AuthenticationSchemes.NTLM | 
                    AuthenticationSchemes.Negotiate;
                options.Authentication.AllowAnonymous = false;
            })
            .Build();
}

Примечание

HTTP.sys делегирует задачи в проверку подлинности в режиме ядра с помощью протокола проверки подлинности Kerberos. Проверка подлинности в режиме пользователя не поддерживается с Kerberos и HTTP.sys. Необходимо использовать учетную запись компьютера для расшифровки маркера/билета Kerberos, полученного из Active Directory и переадресованного клиентом на сервер для проверки подлинности пользователя. Зарегистрируйте имя субъекта-службы (SPN) для узла, а не пользователя приложения.

Примечание

HTTP.sys не поддерживается на сервере Nano Server версии 1709 или более поздней. Чтобы использовать проверку подлинности Windows и HTTP.sys с Nano Server, используйте контейнер Server Core (Microsoft/windowsservercore). Дополнительные сведения о Server Core см. в разделе что такое вариант установки Server Core в Windows Server?.

Авторизация пользователей

Состояние конфигурации анонимного доступа определяет способ [Authorize] [AllowAnonymous] использования атрибутов и в приложении. В следующих двух разделах объясняется, как управлять состояниями запрещенных и разрешенных конфигураций анонимного доступа.

Запретить анонимный доступ

Если включена проверка подлинности Windows, а анонимный доступ отключен, [Authorize] [AllowAnonymous] атрибуты и не действуют. Если сайт IIS настроен для запрета анонимного доступа, запрос никогда не достигнет приложения. По этой причине [AllowAnonymous] атрибут неприменим.

Разрешить анонимный доступ

Если включена проверка подлинности Windows и анонимный доступ, [Authorize] Используйте [AllowAnonymous] атрибуты и. [Authorize]Атрибут позволяет защитить конечные точки приложения, требующие проверки подлинности. [AllowAnonymous]Атрибут переопределяет [Authorize] атрибут в приложениях, разрешающих анонимный доступ. Сведения об использовании атрибутов см. в разделе Простая Авторизация в ASP.NET Core .

Примечание

По умолчанию пользователям, у которых отсутствует авторизация на доступ к странице, предоставляется пустой ответ HTTP 403. По промежуточного слоя статускодепажес можно настроить для предоставления пользователям более качественного интерфейса "отказ в доступе".

Олицетворение

ASP.NET Core не реализует олицетворение. Приложения запускаются с удостоверением приложения для всех запросов с использованием пула приложений или удостоверения процесса. Если приложение должно выполнить действие от имени пользователя, используйте WindowsIdentity. рунимперсонатед во встроенном по промежуточного слоя терминала в Startup.Configure . Выполните одно действие в этом контексте и закройте контекст.

app.Run(async (context) =>
{
    try
    {
        var user = (WindowsIdentity)context.User.Identity;

        await context.Response
            .WriteAsync($"User: {user.Name}\tState: {user.ImpersonationLevel}\n");

        WindowsIdentity.RunImpersonated(user.AccessToken, () =>
        {
            var impersonatedUser = WindowsIdentity.GetCurrent();
            var message =
                $"User: {impersonatedUser.Name}\t" +
                $"State: {impersonatedUser.ImpersonationLevel}";

            var bytes = Encoding.UTF8.GetBytes(message);
            context.Response.Body.Write(bytes, 0, bytes.Length);
        });
    }
    catch (Exception e)
    {
        await context.Response.WriteAsync(e.ToString());
    }
});

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

Хотя пакет Microsoft. AspNetCore. Authentication. Negotiate включает проверку подлинности в Windows, Linux и macOS, олицетворение поддерживается только в Windows.

Преобразования утверждений

При размещении с IIS AuthenticateAsync не вызывается внутренне для инициализации пользователя. Таким образом, реализация IClaimsTransformation, используемая для преобразования утверждений после каждой проверки подлинности, не активируется по умолчанию. Дополнительные сведения и пример кода, который активирует преобразования утверждений, см. в разделе Модуль ASP.NET Core .

При размещении в режиме обработки IIS AuthenticateAsync не вызывается внутренним образом для инициализации пользователя. Таким образом, реализация IClaimsTransformation, используемая для преобразования утверждений после каждой проверки подлинности, не активируется по умолчанию. Дополнительные сведения и пример кода, который активирует преобразования утверждений при размещении внутри процесса, см. в разделе Модуль ASP.NET Core .

Дополнительные ресурсы