ASP.NET Core에서 Windows 인증 구성

작성자: Rick AndersonKirk Larkin

Windows 인증(협상, Kerberos 또는 NTLM 인증이라고도 함)은 IIS, Kestrel 또는 HTTP.sys를 사용하여 호스트된 ASP.NET Core 앱에 대해 구성될 수 있습니다.

Windows 인증은 운영 체제를 사용하여 ASP.NET Core 앱의 사용자를 인증합니다. Windows 인증은 Active Directory 도메인 ID 또는 Windows 계정을 사용하여 사용자를 식별하는 회사 네트워크에서 실행되는 서버에 사용됩니다. Windows 인증은 사용자, 클라이언트 앱 및 웹 서버가 동일한 Windows 도메인에 속하는 인트라넷 환경에 가장 적합합니다.

참고 항목

Windows 인증은 HTTP/2로 지원되지 않습니다. 인증 질문은 HTTP/2 응답에서 보낼 수 있지만 클라이언트는 인증하기 전에 HTTP/1.1로 다운그레이드해야 합니다.

프록시 및 부하 분산 장치 시나리오

Windows 인증은 프록시 또는 부하 분산 장치가 클라이언트와 서버 간의 트래픽을 처리하지 않는 인트라넷에서 주로 사용되는 상태 저장 시나리오입니다. 프록시 또는 부하 분산 장치를 사용하는 경우 Windows 인증은 프록시 또는 부하 분산 장치가 다음을 수행하는 경우에만 작동합니다.

  • 인증을 처리합니다.
  • 사용자 인증 정보를 인증 정보에 작용하는 앱(예: 요청 헤더)에 전달합니다.

프록시 및 부하 분산 장치가 사용되는 환경에서 Windows 인증 대신 OIDC(OpenID Connect)가 있는 ADFS(Active Directory Federated Services)를 사용할 수 있습니다.

IIS/IIS Express

Program.cs에 있는 AddAuthentication을 호출하여 NuGet 패키지 Microsoft.AspNetCore.Authentication.Negotiate 및 인증 서비스를 추가합니다.

using Microsoft.AspNetCore.Authentication.Negotiate;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
   .AddNegotiate();

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = options.DefaultPolicy;
});
builder.Services.AddRazorPages();

var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();

app.Run();

위의 코드는 Windows 인증이 지정된 ASP.NET Core Razor Pages 템플릿에서 생성되었습니다.

시작 설정(디버거)

시작 설정에 대한 구성은 IIS Express용 Properties/launchSettings.json 파일에만 영향을 미치며 Windows 인증용 IIS를 구성하지 않습니다. 서버 구성은 IIS 섹션에 설명되어 있습니다.

Visual Studio 또는 .NET Core CLI를 통해 사용할 수 있는 웹 애플리케이션 템플릿은 Windows 인증을 지원하도록 구성이 가능합니다. 이 경우 Properties/launchSettings.json 파일이 자동으로 업데이트됩니다.

새 프로젝트

Razor Pages 또는 MVC 앱을 새로 만듭니다. 추가 정보 대화 상자에서 인증 유형Windows로 설정합니다.

앱을 실행합니다. 사용자 이름은 렌더링된 앱의 사용자 인터페이스에 표시됩니다.

기존 프로젝트

이 프로젝트의 속성은 Windows 인증을 사용하도록 설정하고 익명 인증은 사용하지 않도록 설정합니다. 프로필 시작 대화 상자를 엽니다.

  1. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.
  2. 디버그 > 일반 탭을 선택하고 디버그 시작 프로필 UI 열기를 선택합니다.
  3. 익명 인증 사용 확인란의 선택을 취소합니다.
  4. Windows 인증 사용 확인란을 선택합니다.

또는 launchSettings.json 파일의 iisSettings 노드에서 속성을 구성할 수 있습니다.

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

IIS

IIS에서는 ASP.NET Core Module을 사용하여 ASP.NET Core 앱을 호스트합니다. Windows 인증은 web.config 파일을 통해 IIS에 대해 구성됩니다. 다음 섹션에서는 다음 방법을 보여줍니다.

  • 앱이 배포될 때 서버에서 Windows 인증을 활성화하는 로컬 web.config 파일 제공하기
  • IIS 관리자를 사용하여 서버에 이미 배포된 ASP.NET Core 앱의 web.config 파일을 구성하기

아직 이렇게 수행하지 않은 경우 IIS를 사용하도록 설정하여 ASP.NET Core 앱을 호스트합니다. 자세한 내용은 IIS가 있는 Windows에서 ASP.NET Core 호스팅을 참조하세요.

Windows 인증에 IIS 역할 서비스를 사용하도록 설정합니다. 자세한 내용은 IIS 역할 서비스에서 Windows 인증 사용 설정하기(2단계 참조)를 참조하세요.

IIS 통합 미들웨어는 기본적으로 요청을 자동으로 인증하도록 구성됩니다. 자세한 내용은 IIS가 있는 Windows에서 ASP.NET Core 호스팅: IIS 옵션(AutomaticAuthentication)을 참조하세요.

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>
    

    .NET Core SDK에서 프로젝트를 게시할 때(<IsTransformWebConfigDisabled> 속성이 프로젝트 파일에서 true로 설정되지 않음) 게시된 web.config 파일에는 <location><system.webServer><security><authentication> 섹션이 포함됩니다. <IsTransformWebConfigDisabled> 속성에 대한 자세한 내용은 IIS가 있는 Windows에서 ASP.NET Core 호스팅을 참조하세요.

  • 프로젝트를 게시하고 배포한 후 IIS 관리자를 사용하여 서버 쪽 구성을 수행합니다.

    1. IIS 관리자에서 연결 사이드바의 사이트 노드 아래에서 IIS 사이트를 선택합니다.
    2. IIS 영역에서 인증을 두 번 클릭합니다.
    3. 익명 인증을 선택합니다. 작업 사이드바에서 사용 안 함을 선택합니다.
    4. Windows 인증을 선택합니다. 작업 사이드바에서 사용을 선택합니다.

    이러한 작업이 수행되면 IIS 관리자에서 앱의 web.config 파일을 수정합니다. anonymousAuthenticationwindowsAuthentication의 설정이 업데이트되면서 <system.webServer><security><authentication> 노드가 추가됩니다.

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

    IIS 관리자에서 web.config 파일에 추가한 <system.webServer> 섹션은 앱이 게시될 때 .NET Core SDK에서 추가한 앱의 <location> 섹션 외부에 있습니다. 섹션이 <location> 노드 외부에 추가되므로 설정은 현재 앱의 하위 앱에 상속됩니다. 상속을 방지하려면 .NET Core SDK에서 제공한 <location><system.webServer> 섹션 내부로 추가된 <security> 섹션을 이동합니다.

    IIS 관리자를 사용하여 IIS 구성을 추가하는 경우 서버에 있는 앱의 web.config 파일에만 영향을 줍니다. 서버의 web.config 복사본이 프로젝트의 web.config 파일로 대체되면 다음번에 앱이 배포될 때 서버에 있는 설정을 덮어쓸 수 있습니다. 다음 방법 중 하나를 사용하여 설정을 관리합니다.

    • 배포 시 web.config 파일이 덮어쓰기되면 IIS 관리자를 사용하여 해당 파일의 설정을 다시 설정합니다.
    • 설정을 사용하여 로컬로 앱에 web.config 파일을 추가합니다.

Kestrel

Microsoft.AspNetCore.Authentication.Negotiate NuGet 패키지는 Kestrel과 함께 사용하여 Windows, Linux 및 macOS에서 협상 및 Kerberos를 사용하는 Windows 인증을 지원할 수 있습니다.

Warning

자격 증명은 연결에서 요청 간에 유지될 수 있습니다. 프록시가 Kestrel과 1:1 연결 선호도(영구 연결)를 유지하지 않는 한 협상 인증을 프록시와 함께 사용하면 안 됩니다.

참고 항목

협상 처리기는 원래 서버가 사용 설정되어 있는지, 그리고 기본적으로 Windows 인증을 지원하는지 검색합니다. 서버에서 Windows 인증을 지원하지만 사용하지 않도록 설정되어 있으면 오류가 발생하면서 서버 구현을 사용하도록 설정하라는 메시지가 표시됩니다. 서버에서 Windows 인증을 사용하도록 설정되어 있으면 협상 처리기가 인증 요청을 투명하게 전달합니다.

인증은 Program.cs에 대해 강조 표시된 다음 코드에 의해 사용 설정됩니다.

using Microsoft.AspNetCore.Authentication.Negotiate;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
   .AddNegotiate();

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = options.DefaultPolicy;
});
builder.Services.AddRazorPages();

var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();

app.Run();

위의 코드는 Windows 인증이 지정된 ASP.NET Core Razor Pages 템플릿에서 생성되었습니다. 위의 코드에는 다음 API가 사용됩니다.

Kerberos 인증 및 RBAC(역할 기반 액세스 제어)

Linux 또는 macOS의 Kerberos 인증은 인증된 사용자에게 역할 정보를 제공하지 않습니다. Kerberos 사용자에게 역할 및 그룹 정보를 추가하려면 LDAP 도메인에서 역할을 검색하도록 인증 처리기를 구성해야 합니다. 가장 기본적인 구성은 쿼리할 LDAP 도메인만 지정하고 인증된 사용자의 컨텍스트를 사용하여 LDAP 도메인을 쿼리합니다.

using Microsoft.AspNetCore.Authentication.Negotiate;
using System.Runtime.InteropServices;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate(options =>
    {
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            options.EnableLdap("contoso.com");
        }
    });

일부 구성에는 LDAP 도메인을 쿼리하기 위해 특정 자격 증명이 필요할 수 있습니다. 자격 증명은 다음 강조 표시된 옵션에서 지정할 수 있습니다.

using Microsoft.AspNetCore.Authentication.Negotiate;
using System.Runtime.InteropServices;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
        .AddNegotiate(options =>
        {
            if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            {
                options.EnableLdap(settings =>
                {
                    settings.Domain = "contoso.com";
                    settings.MachineAccountName = "machineName";
                    settings.MachineAccountPassword =
                                      builder.Configuration["Password"];
                });
            }
        });

builder.Services.AddRazorPages();

기본적으로 협상 인증 처리기는 중첩된 도메인을 확인합니다. 크거나 복잡한 LDAP 환경에서 중첩된 도메인을 확인하면 조회 속도가 느리거나 각 사용자에 대해 많은 메모리가 사용될 수 있습니다. IgnoreNestedGroups 옵션을 사용하여 중첩된 도메인 확인을 사용하지 않도록 설정할 수 있습니다.

익명 요청이 허용됩니다. ASP.NET Core 권한 부여를 사용하여 익명 인증 요청에 이의를 제기합니다.

Windows 환경 구성

Microsoft.AspNetCore.Authentication.Negotiate 구성 요소는 사용자 모드 인증을 수행합니다. SPN(서비스 사용자 이름)은 컴퓨터 계정이 아닌 서비스를 실행하는 사용자 계정에 추가해야 합니다. 관리 명령 셸에서 setspn -S HTTP/myservername.mydomain.com myuser를 실행합니다.

Kerberos 및 NTLM

ASP.NET Core용 Kestrel 협상 패키지는 NTLM보다 더 안전하고 성능이 좋은 인증 체계인 Kerberos를 사용하려고 시도합니다.

using Microsoft.AspNetCore.Authentication.Negotiate;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
   .AddNegotiate();

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = options.DefaultPolicy;
});
builder.Services.AddRazorPages();

var app = builder.Build();

NegotiateDefaults.AuthenticationScheme 은 기본값이므로 Kerberos를 지정합니다.

IIS, IISExpress 및 Kestrel Kerberos 및 NTLM을 모두 지원합니다.

Fiddler와 같은 도구에서 IIS 또는 IISExpress를 사용하여 WWW-Authenticate: 헤더를 검사하면 NTLM이 Negotiate 표시됩니다.

Kestrel 표시만 WWW-Authenticate: Negotiate

헤더는 WWW-Authenticate: Negotiate 서버가 NTLM 또는 Kerberos를 사용할 수 있음을 의미합니다. KestrelNegotiate 헤더 접두사 필요, 요청 또는 응답 인증 헤더에서 직접 지정 NTLM 을 지원 하지 않습니다. NTLM은 지원 Kestrel되지만 Negotiate.

KestrelNTLM 또는 Kerberos가 사용되는지 확인하기 위해 Base64에서 헤더를 디코딩하고 표시하거나 HTTP표시 NTLM 합니다. HTTP 은 Kerberos가 사용되었음을 나타냅니다.

Linux 및 macOS 환경 구성

Linux 또는 macOS 컴퓨터를 Windows 도메인에 조인하기 위한 지침은 Windows 인증 - Kerberos를 사용하여 Azure Data Studio를 SQL Server에 연결 문서에서 확인할 수 있습니다. 해당 지침을 통해 도메인에서 Linux 컴퓨터의 컴퓨터 계정을 만들 수 있습니다. SPN을 해당 컴퓨터 계정에 추가해야 합니다.

참고 항목

Windows 인증 - Kerberos를 사용하여 Azure Data Studio를 SQL Server에 연결 문서의 지침을 따를 때 필요한 경우 python-software-propertiespython3-software-properties로 바꿉니다.

Linux 또는 macOS 컴퓨터가 도메인에 조인되면 SPN과 함께 keytab 파일을 제공하기 위한 추가 단계가 필요합니다.

  • do기본 컨트롤러에서 컴퓨터 계정에 새 웹 서비스 SPN을 추가합니다.
    • setspn -S HTTP/mywebservice.mydomain.com mymachine
    • setspn -S HTTP/mywebservice@MYDOMAIN.COM mymachine
  • ktpass를 사용하여 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 컴퓨터에 복사합니다.
  • 환경 변수 export KRB5_KTNAME=/tmp/mymachine.HTTP.keytab을 통해 keytab 파일을 선택합니다.
  • klist를 호출하여 현재 사용할 수 있는 SPN을 표시합니다.

참고 항목

keytab 파일에는 도메인 액세스 자격 증명이 포함되어 있으며 그에 따라 보호되어야 합니다.

HTTP.sys

HTTP.sys는 협상, NTLM 또는 기본 인증을 사용하는 커널 모드 Windows 인증을 지원합니다.

다음 코드를 통해 인증을 추가하고 Windows 인증에서 HTTP.sys를 사용하도록 앱의 웹 호스트를 구성합니다.

using Microsoft.AspNetCore.Server.HttpSys;
using System.Runtime.InteropServices;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);

if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
    builder.WebHost.UseHttpSys(options =>
        {
            options.Authentication.Schemes =
                AuthenticationSchemes.NTLM |
                AuthenticationSchemes.Negotiate;
            options.Authentication.AllowAnonymous = false;
        });
}

참고 항목

HTTP.sys는 Kerberos 인증 프로토콜을 사용하여 커널 모드 인증에 위임합니다. 사용자 모드 인증은 Kerberos 및 HTTP.sys로 지원되지 않습니다. 머신 계정은 Active Directory에서 가져온 Kerberos 토큰/티켓의 암호를 해독하는 데 사용되고 사용자를 인증하는 서버에 클라이언트에 의해 전달되어야 합니다. 앱의 사용자가 아닌 호스트에 대해 SPN(서비스 사용자 이름)을 등록합니다.

참고 항목

HTTP.sys는 Nano Server 버전 1709 이상에서는 지원되지 않습니다. Nano Server에서 Windows 인증과 HTTP.sys를 사용하려면 Server Core(microsoft/windowsservercore) 컨테이너를 사용합니다. Server Core에 대한 자세한 내용은 Windows Server의 Server Core 설치 옵션은 무엇인가요?를 참조하세요.

사용 권한

익명 액세스의 구성 상태가 [Authorize][AllowAnonymous] 특성이 앱에서 사용되는 방식을 결정합니다. 다음 두 섹션에서는 익명 액세스의 허용되지 않는 구성 상태와 허용되는 구성 상태를 처리하는 방법을 설명합니다.

익명 액세스 허용 안 함

Windows 인증을 사용하도록 설정하고 익명 액세스를 사용하지 않도록 설정하면 [[Authorize]]\(xref:Microsoft.AspNetCore.Authorization.AuthorizeAttribute\) 및 [AllowAnonymous] 특성이 적용되지 않습니다. IIS 사이트가 익명 액세스를 허용하지 않도록 구성된 경우 요청이 앱에 도달하지 않습니다. 이러한 이유로 [AllowAnonymous] 특성을 적용할 수 없습니다.

익명 액세스 허용

Windows 인증과 익명 액세스를 모두 사용하도록 설정하면 [[Authorize]]\(xref:Microsoft.AspNetCore.Authorization.AuthorizeAttribute\) 및 [AllowAnonymous] 특성을 사용합니다. [[Authorize]]\(xref:Microsoft.AspNetCore.Authorization.AuthorizeAttribute\) 특성을 사용하면 인증이 필요한 앱의 엔드포인트를 보호할 수 있습니다. [AllowAnonymous] 특성은 익명 액세스를 허용하는 앱에서 [Authorize] 특성을 재정의합니다. 특성 사용에 대한 자세한 내용은 ASP.NET Core의 단순 권한 부여를 참조하세요.

참고 항목

기본적으로 페이지에 액세스할 수 있는 권한이 없는 사용자에게는 빈 HTTP 403 응답이 표시됩니다. StatusCodePages 미들웨어를 사용자에게 더 나은 ‘액세스 거부’ 경험 제공하도록 구성할 수 있습니다.

가장 행위

ASP.NET Core는 가장을 구현하지 않습니다. 앱은 앱 풀 또는 프로세스 ID를 사용하여 모든 요청에 대해 앱의 ID로 실행됩니다. 앱이 사용자를 대신하여 작업을 수행해야 하는 경우 Program.cs에 있는 터미널 인라인 미들웨어WindowsIdentity.RunImpersonated 또는 RunImpersonatedAsync를 사용합니다. 이 컨텍스트에서 단일 작업을 실행한 다음 컨텍스트를 닫습니다.

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

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

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

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

Microsoft.AspNetCore.Authentication.Negotiate 패키지는 Windows, Linux 및 macOS에서 인증을 사용하도록 설정하지만 가장은 Windows에서만 지원됩니다.

클레임 변환

IIS로 호스팅하는 경우 사용자를 초기화하기 위해 AuthenticateAsync를 내부적으로 호출하지 않습니다. 따라서 모든 인증 후에 클레임을 변환하는 데 사용되는 IClaimsTransformation 구현은 기본적으로 활성화되지 않습니다. 클레임 변환을 활성화하는 코드 예제 및 자세한 내용은 In-Process 호스팅과 Out-of-process 호스팅 간의 차이점을 참조하세요.

추가 리소스

Windows 인증(협상, Kerberos 또는 NTLM 인증이라고도 함)은 IIS, Kestrel 또는 HTTP.sys를 사용하여 호스트된 ASP.NET Core 앱에 대해 구성될 수 있습니다.

Windows 인증은 운영 체제를 사용하여 ASP.NET Core 앱의 사용자를 인증합니다. 서버가 Active Directory 도메인 ID 또는 Windows 계정을 사용하여 사용자를 식별하는 회사 네트워크에서 실행되는 경우 Windows 인증을 사용할 수 있습니다. Windows 인증은 사용자, 클라이언트 앱 및 웹 서버가 동일한 Windows 도메인에 속하는 인트라넷 환경에 가장 적합합니다.

참고 항목

Windows 인증은 HTTP/2로 지원되지 않습니다. 인증 질문은 HTTP/2 응답에서 보낼 수 있지만 클라이언트는 인증하기 전에 HTTP/1.1로 다운그레이드해야 합니다.

프록시 및 부하 분산 장치 시나리오

Windows 인증은 프록시 또는 부하 분산 장치가 클라이언트와 서버 간의 트래픽을 처리하지 않는 인트라넷에서 주로 사용되는 상태 저장 시나리오입니다. 프록시 또는 부하 분산 장치를 사용하는 경우 Windows 인증은 프록시 또는 부하 분산 장치가 다음을 수행하는 경우에만 작동합니다.

  • 인증을 처리합니다.
  • 사용자 인증 정보를 인증 정보에 작용하는 앱(예: 요청 헤더)에 전달합니다.

프록시 및 부하 분산 장치가 사용되는 환경에서 Windows 인증 대신 OIDC(OpenID Connect)가 있는 ADFS(Active Directory Federated Services)를 사용할 수 있습니다.

IIS/IIS Express

Startup.ConfigureServices에 있는 AddAuthentication(Microsoft.AspNetCore.Server.IISIntegration 네임스페이스)을 호출하여 인증 서비스를 추가합니다.

services.AddAuthentication(IISDefaults.AuthenticationScheme);

시작 설정(디버거)

시작 설정에 대한 구성은 IIS Express용 Properties/launchSettings.json 파일에만 영향을 미치며 Windows 인증용 IIS를 구성하지 않습니다. 서버 구성은 IIS 섹션에 설명되어 있습니다.

Visual Studio 또는 .NET Core CLI를 통해 사용할 수 있는 웹 애플리케이션 템플릿은 Windows 인증을 지원하도록 구성이 가능합니다. 이 경우 Properties/launchSettings.json 파일이 자동으로 업데이트됩니다.

새 프로젝트

  1. 새 프로젝트를 만듭니다.
  2. 새 ASP.NET Core 웹 애플리케이션을 선택합니다. 다음을 선택합니다.
  3. 프로젝트 이름 필드에 이름을 입력합니다. 위치 항목이 올바른지 확인하거나 프로젝트의 위치를 제공합니다. 만들기를 실행합니다.
  4. 인증에서 변경을 선택합니다.
  5. 인증 변경 창에서 Windows 인증을 선택합니다. 확인을 선택합니다.
  6. 웹 애플리케이션을 선택합니다.
  7. 만들기를 실행합니다.

앱을 실행합니다. 사용자 이름은 렌더링된 앱의 사용자 인터페이스에 표시됩니다.

기존 프로젝트

프로젝트의 속성은 Windows 인증을 사용하도록 설정하고 익명 인증을 사용하지 않도록 설정합니다.

  1. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.
  2. 디버그 탭을 선택합니다.
  3. 익명 인증 사용 확인란의 선택을 취소합니다.
  4. Windows 인증 사용 확인란을 선택합니다.
  5. 속성 페이지를 저장하고 닫습니다.

또는 launchSettings.json 파일의 iisSettings 노드에서 속성을 구성할 수 있습니다.

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

기존 프로젝트를 수정할 때 프로젝트 파일에 Microsoft.AspNetCore.App 메타패키지 또는 Microsoft.AspNetCore.Authentication NuGet 패키지에 대한 패키지 참조가 포함되어 있는지 확인합니다.

IIS

IIS에서는 ASP.NET Core Module을 사용하여 ASP.NET Core 앱을 호스트합니다. Windows 인증은 web.config 파일을 통해 IIS에 대해 구성됩니다. 다음 섹션에서는 다음 방법을 보여줍니다.

  • 앱이 배포될 때 서버에서 Windows 인증을 활성화하는 로컬 web.config 파일 제공하기
  • IIS 관리자를 사용하여 서버에 이미 배포된 ASP.NET Core 앱의 web.config 파일을 구성하기

아직 이렇게 수행하지 않은 경우 IIS를 사용하도록 설정하여 ASP.NET Core 앱을 호스트합니다. 자세한 내용은 IIS가 있는 Windows에서 ASP.NET Core 호스팅을 참조하세요.

Windows 인증에 IIS 역할 서비스를 사용하도록 설정합니다. 자세한 내용은 IIS 역할 서비스에서 Windows 인증 사용 설정하기(2단계 참조)를 참조하세요.

IIS 통합 미들웨어는 기본적으로 요청을 자동으로 인증하도록 구성됩니다. 자세한 내용은 IIS가 있는 Windows에서 ASP.NET Core 호스팅: IIS 옵션(AutomaticAuthentication)을 참조하세요.

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>
    

    .NET Core SDK에서 프로젝트를 게시할 때(<IsTransformWebConfigDisabled> 속성이 프로젝트 파일에서 true로 설정되지 않음) 게시된 web.config 파일에는 <location><system.webServer><security><authentication> 섹션이 포함됩니다. <IsTransformWebConfigDisabled> 속성에 대한 자세한 내용은 IIS가 있는 Windows에서 ASP.NET Core 호스팅을 참조하세요.

  • 프로젝트를 게시하고 배포한 후 IIS 관리자를 사용하여 서버 쪽 구성을 수행합니다.

    1. IIS 관리자에서 연결 사이드바의 사이트 노드 아래에서 IIS 사이트를 선택합니다.
    2. IIS 영역에서 인증을 두 번 클릭합니다.
    3. 익명 인증을 선택합니다. 작업 사이드바에서 사용 안 함을 선택합니다.
    4. Windows 인증을 선택합니다. 작업 사이드바에서 사용을 선택합니다.

    이러한 작업이 수행되면 IIS 관리자에서 앱의 web.config 파일을 수정합니다. anonymousAuthenticationwindowsAuthentication의 설정이 업데이트되면서 <system.webServer><security><authentication> 노드가 추가됩니다.

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

    IIS 관리자에서 web.config 파일에 추가한 <system.webServer> 섹션은 앱이 게시될 때 .NET Core SDK에서 추가한 앱의 <location> 섹션 외부에 있습니다. 섹션이 <location> 노드 외부에 추가되므로 설정은 현재 앱의 하위 앱에 상속됩니다. 상속을 방지하려면 .NET Core SDK에서 제공한 <location><system.webServer> 섹션 내부로 추가된 <security> 섹션을 이동합니다.

    IIS 관리자를 사용하여 IIS 구성을 추가하는 경우 서버에 있는 앱의 web.config 파일에만 영향을 줍니다. 서버의 web.config 복사본이 프로젝트의 web.config 파일로 대체되면 다음번에 앱이 배포될 때 서버에 있는 설정을 덮어쓸 수 있습니다. 다음 방법 중 하나를 사용하여 설정을 관리합니다.

    • 배포 시 web.config 파일이 덮어쓰기되면 IIS 관리자를 사용하여 해당 파일의 설정을 다시 설정합니다.
    • 설정을 사용하여 로컬로 앱에 web.config 파일을 추가합니다.

Kestrel

Microsoft.AspNetCore.Authentication.Negotiate NuGet 패키지는 Kestrel과 함께 사용하여 Windows, Linux 및 macOS에서 협상 및 Kerberos를 사용하는 Windows 인증을 지원할 수 있습니다.

Warning

자격 증명은 연결에서 요청 간에 유지될 수 있습니다. 프록시가 Kestrel과 1:1 연결 선호도(영구 연결)를 유지하지 않는 한 협상 인증을 프록시와 함께 사용하면 안 됩니다.

참고 항목

협상 처리기는 원래 서버가 사용 설정되어 있는지, 그리고 기본적으로 Windows 인증을 지원하는지 검색합니다. 서버에서 Windows 인증을 지원하지만 사용하지 않도록 설정되어 있으면 오류가 발생하면서 서버 구현을 사용하도록 설정하라는 메시지가 표시됩니다. 서버에서 Windows 인증을 사용하도록 설정되어 있으면 협상 처리기가 인증 요청을 투명하게 전달합니다.

Startup.ConfigureServices에 있는 AddAuthenticationAddNegotiate을 호출하여 인증 서비스를 추가합니다.

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

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

Startup.Configure에 있는 UseAuthentication을 호출하여 인증 미들웨어를 추가합니다.

app.UseAuthentication();

미들웨어 순서에 대한 자세한 내용은 ASP.NET Core 미들웨어를 참조하세요.

Kerberos 인증 및 RBAC(역할 기반 액세스 제어)

Linux 또는 macOS의 Kerberos 인증은 인증된 사용자에게 역할 정보를 제공하지 않습니다. Kerberos 사용자에게 역할 및 그룹 정보를 추가하려면 LDAP 도메인에서 역할을 검색하도록 인증 처리기를 구성해야 합니다. 가장 기본적인 구성은 쿼리할 LDAP 도메인만 지정하고 인증된 사용자의 컨텍스트를 사용하여 LDAP 도메인을 쿼리합니다.

services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate(options =>
    {
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            options.EnableLdap("contoso.com");
        }
    });

일부 구성에는 LDAP 도메인을 쿼리하기 위해 특정 자격 증명이 필요할 수 있습니다. 자격 증명은 다음 강조 표시된 옵션에서 지정할 수 있습니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDatabaseDeveloperPageExceptionFilter();
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
        .AddNegotiate(options =>
        {
            if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            {
                options.EnableLdap(settings =>
                {
                    settings.Domain = "contoso.com";
                    settings.MachineAccountName = "machineName";
                    settings.MachineAccountPassword = Configuration["Password"]
                });
            }
        });

    services.AddRazorPages();
}

기본적으로 협상 인증 처리기는 중첩된 도메인을 확인합니다. 크거나 복잡한 LDAP 환경에서 중첩된 도메인을 확인하면 조회 속도가 느리거나 각 사용자에 대해 많은 메모리가 사용될 수 있습니다. IgnoreNestedGroups 옵션을 사용하여 중첩된 도메인 확인을 사용하지 않도록 설정할 수 있습니다.

익명 요청이 허용됩니다. ASP.NET Core 권한 부여를 사용하여 익명 인증 요청에 이의를 제기합니다.

AuthenticationScheme에는 NuGet 패키지 Microsoft.AspNetCore.Authentication.Negotiate가 필요합니다.

Windows 환경 구성

Microsoft.AspNetCore.Authentication.Negotiate 구성 요소는 사용자 모드 인증을 수행합니다. SPN(서비스 사용자 이름)은 컴퓨터 계정이 아닌 서비스를 실행하는 사용자 계정에 추가해야 합니다. 관리 명령 셸에서 setspn -S HTTP/myservername.mydomain.com myuser를 실행합니다.

Linux 및 macOS 환경 구성

Linux 또는 macOS 컴퓨터를 Windows 도메인에 조인하기 위한 지침은 Windows 인증 - Kerberos를 사용하여 Azure Data Studio를 SQL Server에 연결 문서에서 확인할 수 있습니다. 해당 지침을 통해 도메인에서 Linux 컴퓨터의 컴퓨터 계정을 만들 수 있습니다. SPN을 해당 컴퓨터 계정에 추가해야 합니다.

참고 항목

Windows 인증 - Kerberos를 사용하여 Azure Data Studio를 SQL Server에 연결 문서의 지침을 따를 때 필요한 경우 python-software-propertiespython3-software-properties로 바꿉니다.

Linux 또는 macOS 컴퓨터가 도메인에 조인되면 SPN과 함께 keytab 파일을 제공하기 위한 추가 단계가 필요합니다.

  • do기본 컨트롤러에서 컴퓨터 계정에 새 웹 서비스 SPN을 추가합니다.
    • setspn -S HTTP/mywebservice.mydomain.com mymachine
    • setspn -S HTTP/mywebservice@MYDOMAIN.COM mymachine
  • ktpass를 사용하여 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 컴퓨터에 복사합니다.
  • 환경 변수 export KRB5_KTNAME=/tmp/mymachine.HTTP.keytab을 통해 keytab 파일을 선택합니다.
  • klist를 호출하여 현재 사용할 수 있는 SPN을 표시합니다.

참고 항목

keytab 파일에는 도메인 액세스 자격 증명이 포함되어 있으며 그에 따라 보호되어야 합니다.

HTTP.sys

HTTP.sys는 협상, NTLM 또는 기본 인증을 사용하는 커널 모드 Windows 인증을 지원합니다.

Startup.ConfigureServices에 있는 AddAuthentication(Microsoft.AspNetCore.Server.HttpSys 네임스페이스)을 호출하여 인증 서비스를 추가합니다.

services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);

Windows 인증(Program.cs)에서 HTTP.sys를 사용하도록 앱의 웹 호스트를 구성합니다. UseHttpSysMicrosoft.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;
                    });
            });
}

참고 항목

HTTP.sys는 Kerberos 인증 프로토콜을 사용하여 커널 모드 인증에 위임합니다. 사용자 모드 인증은 Kerberos 및 HTTP.sys로 지원되지 않습니다. 머신 계정은 Active Directory에서 가져온 Kerberos 토큰/티켓의 암호를 해독하는 데 사용되고 사용자를 인증하는 서버에 클라이언트에 의해 전달되어야 합니다. 앱의 사용자가 아닌 호스트에 대해 SPN(서비스 사용자 이름)을 등록합니다.

참고 항목

HTTP.sys는 Nano Server 버전 1709 이상에서는 지원되지 않습니다. Nano Server에서 Windows 인증과 HTTP.sys를 사용하려면 Server Core(microsoft/windowsservercore) 컨테이너를 사용합니다. Server Core에 대한 자세한 내용은 Windows Server의 Server Core 설치 옵션은 무엇인가요?를 참조하세요.

사용 권한

익명 액세스의 구성 상태가 [Authorize][AllowAnonymous] 특성이 앱에서 사용되는 방식을 결정합니다. 다음 두 섹션에서는 익명 액세스의 허용되지 않는 구성 상태와 허용되는 구성 상태를 처리하는 방법을 설명합니다.

익명 액세스 허용 안 함

Windows 인증을 사용하도록 설정하고 익명 액세스를 사용하지 않도록 설정하면 [Authorize][AllowAnonymous] 특성이 적용되지 않습니다. IIS 사이트가 익명 액세스를 허용하지 않도록 구성된 경우 요청이 앱에 도달하지 않습니다. 이러한 이유로 [AllowAnonymous] 특성을 적용할 수 없습니다.

익명 액세스 허용

Windows 인증과 익명 액세스를 모두 사용하도록 설정하는 경우 [Authorize][AllowAnonymous] 특성을 사용합니다. [Authorize] 특성을 사용하면 인증이 필요한 앱의 엔드포인트를 보호할 수 있습니다. [AllowAnonymous] 특성은 익명 액세스를 허용하는 앱에서 [Authorize] 특성을 재정의합니다. 특성 사용에 대한 자세한 내용은 ASP.NET Core의 단순 권한 부여를 참조하세요.

참고 항목

기본적으로 페이지에 액세스할 수 있는 권한이 없는 사용자에게는 빈 HTTP 403 응답이 표시됩니다. StatusCodePages 미들웨어를 사용자에게 더 나은 ‘액세스 거부’ 경험 제공하도록 구성할 수 있습니다.

가장 행위

ASP.NET Core는 가장을 구현하지 않습니다. 앱은 앱 풀 또는 프로세스 ID를 사용하여 모든 요청에 대해 앱의 ID로 실행됩니다. 앱이 사용자를 대신하여 작업을 수행해야 하는 경우 Startup.Configure에 있는 터미널 인라인 미들웨어WindowsIdentity.RunImpersonated 또는 RunImpersonatedAsync를 사용합니다. 이 컨텍스트에서 단일 작업을 실행한 다음 컨텍스트를 닫습니다.

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

Microsoft.AspNetCore.Authentication.Negotiate 패키지는 Windows, Linux 및 macOS에서 인증을 사용하도록 설정하지만 가장은 Windows에서만 지원됩니다.

클레임 변환

IIS로 호스팅하는 경우 사용자를 초기화하기 위해 AuthenticateAsync를 내부적으로 호출하지 않습니다. 따라서 모든 인증 후에 클레임을 변환하는 데 사용되는 IClaimsTransformation 구현은 기본적으로 활성화되지 않습니다. 클레임 변환을 활성화하는 코드 예제 및 자세한 내용은 In-Process 호스팅과 Out-of-process 호스팅 간의 차이점을 참조하세요.

추가 리소스