ASP.NET Core'de Windows Kimlik Doğrulamasını Yapılandırma

Yayımlayanlar Rick Anderson ve Kirk Larkin

Iis, veya HTTP.sys ile barındırılan ASP.NET Core uygulamaları için Windows Kimlik Doğrulaması (Anlaşma, KestrelKerberos veya NTLM kimlik doğrulaması olarak da bilinir) yapılandırılabilir.

Windows Kimlik Doğrulaması, ASP.NET Core uygulamalarının kullanıcılarının kimliğini doğrulamak için işletim sistemine dayanır. Windows Kimlik Doğrulaması, kullanıcıları tanımlamak için Active Directory etki alanı kimliklerini veya Windows hesaplarını kullanan bir şirket ağında çalışan sunucular için kullanılır. Windows Kimlik Doğrulaması, kullanıcıların, istemci uygulamalarının ve web sunucularının aynı Windows etki alanına ait olduğu intranet ortamlarına en uygun olanıdır.

Dekont

Windows Kimlik Doğrulaması HTTP/2 ile desteklenmez. Kimlik doğrulama zorlukları HTTP/2 yanıtlarında gönderilebilir, ancak istemcinin kimlik doğrulamasından önce HTTP/1.1'e düşürmesi gerekir.

Ara sunucu ve yük dengeleyici senaryoları

Windows Kimlik Doğrulaması, öncelikle intranette kullanılan ve bir ara sunucunun veya yük dengeleyicinin genellikle istemciler ve sunucular arasındaki trafiği işlemediği durum bilgisi olan bir senaryodur. Ara sunucu veya yük dengeleyici kullanılıyorsa, Windows Kimlik Doğrulaması yalnızca ara sunucu veya yük dengeleyici:

  • Kimlik doğrulamasını işler.
  • Kullanıcı kimlik doğrulama bilgilerini uygulamaya geçirir (örneğin, bir istek üst bilgisinde), kimlik doğrulama bilgilerine göre hareket eder.

Ara sunucuların ve yük dengeleyicilerin kullanıldığı ortamlarda Windows Kimlik Doğrulaması'nın bir alternatifi, OpenID Bağlan (OIDC) ile Active Directory Federasyon Hizmetleri'dir (ADFS).

IIS/IIS Express

içinde arayarak Program.csAddAuthentication Microsoft.AspNetCore.Authentication.Negotiate nuGet paketini ve kimlik doğrulama hizmetlerini ekleyin:

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

Yukarıdaki kod, Windows Kimlik Doğrulaması belirtilen ASP.NET Temel Razor Sayfalar şablonu tarafından oluşturulmuştur.

Başlatma ayarları (hata ayıklayıcı)

Başlatma ayarları yapılandırması yalnızca IIS Express dosyasını etkiler Properties/launchSettings.json ve Windows Kimlik Doğrulaması için IIS'yi yapılandırmaz. Sunucu yapılandırması IIS bölümünde açıklanmıştır.

Visual Studio veya .NET Core CLI aracılığıyla kullanılabilen Web Uygulaması şablonları, dosyayı otomatik olarak güncelleştiren Windows Kimlik Doğrulamasını Properties/launchSettings.json destekleyecek şekilde yapılandırılabilir.

Yeni proje

Yeni Razor bir Sayfalar veya MVC uygulaması oluşturun. Ek bilgiler iletişim kutusunda Kimlik doğrulama türünü Windows olarak ayarlayın.

Uygulamayı çalıştırma. Kullanıcı adı, işlenen uygulamanın kullanıcı arabiriminde görünür.

Mevcut proje

Projenin özellikleri Windows Kimlik Doğrulaması'nı etkinleştirir ve Anonim Kimlik Doğrulamasını devre dışı bırakır. Başlatma profilleri iletişim kutusunu açın:

  1. Çözüm Gezgini'nde projeye sağ tıklayın ve Özellikler paneli öğesini seçin.
  2. Hata Ayıklama ve Genel sekmesini seçin ve Hata ayıklama başlatma profilleri kullanıcı arabirimini aç'ı seçin.
  3. Anonim Kimlik Doğrulamasını Etkinleştir onay kutusunu temizleyin.
  4. Windows Kimlik Doğrulamasını Etkinleştir onay kutusunu seçin.

Alternatif olarak, özellikler dosyanın düğümünde iisSettingslaunchSettings.json yapılandırılabilir:

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

IIS

IIS, ASP.NET Core uygulamalarını barındırmak için ASP.NET Core Modülünü kullanır. Windows Kimlik Doğrulaması, web.config dosyası aracılığıyla IIS için yapılandırılır. Aşağıdaki bölümlerde nasıl yapılır gösterilmektedir:

  • Uygulama dağıtıldığında sunucuda Windows Kimlik Doğrulamasını etkinleştiren yerel bir web.config dosyası sağlayın.
  • Sunucuya zaten dağıtılmış olan bir ASP.NET Core uygulamasının web.config dosyasını yapılandırmak için IIS Yöneticisi'ni kullanın.

Henüz yapmadıysanız, ASP.NET Core uygulamalarını barındırmak için IIS'yi etkinleştirin. Daha fazla bilgi için bkz . IIS ile Windows'ta Konak ASP.NET Core.

Windows Kimlik Doğrulaması için IIS Rol Hizmeti'ni etkinleştirin. Daha fazla bilgi için bkz . IIS Rol Hizmetleri'nde Windows Kimlik Doğrulamasını Etkinleştirme (bkz. Adım 2).

IIS Tümleştirme Ara Yazılımı , isteklerin kimliğini varsayılan olarak otomatik olarak doğrulayarak yapılandırılır. Daha fazla bilgi için bkz . IIS ile Windows'ta Konak ASP.NET Core: IIS seçenekleri (AutomaticAuthentication).

ASP.NET Çekirdek Modülü, Windows Kimlik Doğrulama belirtecini varsayılan olarak uygulamaya iletecek şekilde yapılandırılır. Daha fazla bilgi için bkz . ASP.NET Çekirdek Modülü yapılandırma başvurusu: aspNetCore öğesinin öznitelikleri.

Aşağıdaki yaklaşımlardan birini kullanın:

  • Projeyi yayımlamadan ve dağıtmadan önce aşağıdaki web.config dosyasını proje köküne ekleyin:

    <?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>
    

    Proje .NET Core SDK'sı tarafından yayımlandığında (özellik proje dosyasında olarak ayarlanmadan <IsTransformWebConfigDisabled>true ), yayımlanan web.config dosyası bölümünü içerir <location><system.webServer><security><authentication> . özelliği hakkında <IsTransformWebConfigDisabled> daha fazla bilgi için bkz . IIS ile Windows'ta Konak ASP.NET Core.

  • Projeyi yayımladıktan ve dağıttığınızda IIS Yöneticisi ile sunucu tarafı yapılandırma gerçekleştirin:

    1. IIS Yöneticisi'nde, Bağlan ions kenar çubuğunun Siteler düğümü altında IIS sitesini seçin.
    2. IIS alanında Kimlik Doğrulaması'na çift tıklayın.
    3. Anonim Kimlik Doğrulaması'ı seçin. Eylemler kenar çubuğunda Devre Dışı Bırak'ı seçin.
    4. Windows Kimlik Doğrulaması'ı seçin. Eylemler kenar çubuğunda Etkinleştir'i seçin.

    Bu eylemler gerçekleştirildiğinde, IIS Yöneticisi uygulamanın web.config dosyasını değiştirir. <system.webServer><security><authentication> ve windowsAuthenticationiçin anonymousAuthentication güncelleştirilmiş ayarlarla bir düğüm eklenir:

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

    <system.webServer> IIS Yöneticisi tarafından web.config dosyasına eklenen bölüm, uygulama <location> yayımlandığında uygulamanın .NET Core SDK'sı tarafından eklenen bölümünün dışındadır. Bölüm düğümün dışına eklendiğinden <location> , ayarlar geçerli uygulamaya herhangi bir alt uygulama tarafından devralınır. Devralmayı önlemek için eklenen <security> bölümü .NET Core SDK'sının <location><system.webServer> sağladığı bölümün içine taşıyın.

    IIS yapılandırmasını eklemek için IIS Yöneticisi kullanıldığında, yalnızca uygulamanın sunucudaki web.config dosyasını etkiler. Sunucunun web.config kopyası projenin web.config dosyasıyla değiştirilirse, uygulamanın sonraki dağıtımı sunucudaki ayarların üzerine yazabilir. Ayarları yönetmek için aşağıdaki yaklaşımlardan birini kullanın:

    • Dağıtımda dosyanın üzerine yazıldıktan sonra web.config dosyasındaki ayarları sıfırlamak için IIS Yöneticisi'ni kullanın.
    • Ayarlarla uygulamaya yerel olarak bir web.config dosyası ekleyin.

Kestrel

Microsoft.AspNetCore.Authentication.Negotiate NuGet paketi, Windows, Linux ve macOS üzerinde Negotiate ve Kerberos kullanarak Windows Kimlik Doğrulamasını desteklemek için ile Kestrel birlikte kullanılabilir.

Uyarı

Kimlik bilgileri bir bağlantıdaki istekler arasında kalıcı hale gelebilir. Ara sunucu ile 1:1 bağlantı benşimini (kalıcı bir bağlantı) korumadığı sürece anlaşma kimlik doğrulaması proxy'lerle Kestrelkullanılmamalıdır.

Dekont

Negotiate işleyicisi, temel sunucunun Windows Kimlik Doğrulamasını yerel olarak destekleyip desteklemediğini ve etkinleştirilip etkinleştirilmediğini algılar. Sunucu Windows Kimlik Doğrulaması'nı destekliyorsa ancak devre dışı bırakıldıysa, sunucu uygulamasını etkinleştirmenizi isteyen bir hata oluşur. Sunucuda Windows Kimlik Doğrulaması etkinleştirildiğinde, Anlaşma işleyicisi kimlik doğrulama isteklerini ona saydam bir şekilde iletir.

Kimlik doğrulaması, aşağıdaki vurgulanmış kod tarafından şu şekilde Program.csetkinleştirilir:

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

Yukarıdaki kod, Windows Kimlik Doğrulaması belirtilen ASP.NET Temel Razor Sayfalar şablonu tarafından oluşturulmuştur. Yukarıdaki kodda aşağıdaki API'ler kullanılır:

Kerberos kimlik doğrulaması ve rol tabanlı erişim denetimi (RBAC)

Linux veya macOS'ta Kerberos kimlik doğrulaması, kimliği doğrulanmış bir kullanıcı için herhangi bir rol bilgisi sağlamaz. Kerberos kullanıcısına rol ve grup bilgileri eklemek için, kimlik doğrulama işleyicisinin rolleri bir LDAP etki alanından alacak şekilde yapılandırılması gerekir. En temel yapılandırma yalnızca sorgulamak için bir LDAP etki alanı belirtir ve KIMLIĞI doğrulanmış kullanıcının bağlamını kullanarak LDAP etki alanını sorgular:

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

Bazı yapılandırmalar LDAP etki alanını sorgulamak için belirli kimlik bilgileri gerektirebilir. Kimlik bilgileri aşağıdaki vurgulanmış seçeneklerde belirtilebilir:

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

Varsayılan olarak, anlaşma kimlik doğrulaması işleyicisi iç içe etki alanlarını çözümler. Büyük veya karmaşık bir LDAP ortamında iç içe etki alanlarını çözümlemek, yavaş arama veya her kullanıcı için çok fazla bellek kullanılmasına neden olabilir. İç içe etki alanı çözümleme seçeneği kullanılarak IgnoreNestedGroups devre dışı bırakılabilir.

Anonim isteklere izin verilir. Kimlik doğrulaması için anonim isteklere meydan okumak için ASP.NET Çekirdek Yetkilendirme'yi kullanın.

Windows ortamı yapılandırması

Microsoft.AspNetCore.Authentication.Negotiate bileşeni Kullanıcı Modu kimlik doğrulamasını gerçekleştirir. Hizmet Asıl Adları (SPN) makine hesabına değil hizmeti çalıştıran kullanıcı hesabına eklenmelidir. Yönetici komut kabuğunda yürütür setspn -S HTTP/myservername.mydomain.com myuser .

Kerberos ile NTLM karşılaştırması

ASP.NET Core için Anlaşma paketiKestrel, NTLM'den daha güvenli ve çok biçimli bir kimlik doğrulama şeması olan Kerberos'un kullanılmasını dener:

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 , varsayılan olduğundan Kerberos'un adını belirtir.

IIS, IISExpress ve Kestrel hem Kerberos hem de NTLM'yi destekler.

IIS veya IISExpress kullanarak WWW-Authenticate: üst bilgisini Fiddler gibi bir araçla incelemek veya NTLM'yi Negotiate gösterir.

Kestrel yalnızca gösterir WWW-Authenticate: Negotiate

Üst WWW-Authenticate: Negotiate bilgi, sunucunun NTLM veya Kerberos kullanabileceği anlamına gelir. Kestrelüst bilgi ön ekini Negotiategerektirir; istek veya yanıt kimlik doğrulaması üst bilgilerinde doğrudan belirtmeyi NTLM desteklemez. NTLM içinde Kestreldesteklenir, ancak olarak Negotiategönderilmelidir.

üzerinde Kestrel, NTLM veya Kerberos'un kullanılıp kullanılmadiğini görmek için Base64 üst bilgisinin kodunu çözer ve ya da NTLMHTTPgösterir. HTTP Kerberos'un kullanıldığını gösterir.

Linux ve macOS ortam yapılandırması

Linux veya macOS makinesini Windows etki alanına ekleme yönergeleri, Windows kimlik doğrulaması - Kerberos kullanarak Azure Data Studio'yu SQL Server'ınıza Bağlan makalesinde bulunabilir. Yönergeler, etki alanındaki Linux makinesi için bir makine hesabı oluşturur. SPN'ler bu makine hesabına eklenmelidir.

Linux veya macOS makinesi etki alanına katıldıktan sonra SPN'lerle bir anahtar sekmesi dosyası sağlamak için ek adımlar gerekir:

  • Etki alanı denetleyicisinde makine hesabına yeni web hizmeti SPN'leri ekleyin:
    • setspn -S HTTP/mywebservice.mydomain.com mymachine
    • setspn -S HTTP/mywebservice@MYDOMAIN.COM mymachine
  • Anahtar sekmesi dosyası oluşturmak için ktpass kullanın:
    • 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
    • Bazı alanlar belirtildiği gibi büyük harfle belirtilmelidir.
  • Anahtar sekmesi dosyasını Linux veya macOS makinesine kopyalayın.
  • Bir ortam değişkeni aracılığıyla tuş sekmesi dosyasını seçin: export KRB5_KTNAME=/tmp/mymachine.HTTP.keytab
  • Şu anda kullanılabilir durumdaki SPN'leri göstermek için çağırın klist .

Dekont

Anahtar sekmesi dosyası etki alanı erişim kimlik bilgilerini içerir ve buna göre korunmalıdır.

HTTP.sys

HTTP.sys Negotiate, NTLM veya Basic kimlik doğrulaması kullanarak Çekirdek Modu Windows Kimlik Doğrulamayı destekler.

Aşağıdaki kod kimlik doğrulaması ekler ve uygulamanın web konağını Windows Kimlik Doğrulaması ile HTTP.sys kullanacak şekilde yapılandırılır:

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

Dekont

HTTP.sys, Kerberos kimlik doğrulama protokolüyle Çekirdek Modu kimlik doğrulamasına temsilci olarak çalışır. Kullanıcı Modu kimlik doğrulaması Kerberos ve HTTP.sys ile desteklenmez. Makine hesabı, Active Directory'den alınan ve istemci tarafından kullanıcının kimliğini doğrulamak üzere sunucuya iletilen Kerberos belirtecinin/anahtarının şifresini çözmek için kullanılmalıdır. Uygulamanın kullanıcısı için değil konak için Hizmet Asıl Adı'nı (SPN) kaydedin.

Dekont

HTTP.sys, Nano Sunucu sürüm 1709 veya sonraki sürümlerde desteklenmez. Nano Sunucu ile Windows Kimlik Doğrulaması ve HTTP.sys kullanmak için bir Sunucu Çekirdeği (microsoft/windowsservercore) kapsayıcısı kullanın. Sunucu Çekirdeği hakkında daha fazla bilgi için bkz . Windows Server'da Sunucu Çekirdeği yükleme seçeneği nedir?.

Kullanıcıları yetkilendirme

Anonim erişimin yapılandırma durumu, ve [AllowAnonymous] özniteliklerinin uygulamada nasıl [Authorize] kullanılacağını belirler. Aşağıdaki iki bölümde anonim erişimin izin verilmeyen ve izin verilen yapılandırma durumlarının nasıl işleneceğini açıklanmaktadır.

Anonim erişime izin verme

Windows Kimlik Doğrulaması etkinleştirildiğinde ve anonim erişim devre dışı bırakıldığında[[Authorize]](xref:Microsoft.AspNetCore.Authorization.AuthorizeAttribute) ve [AllowAnonymous] özniteliklerinin hiçbir etkisi olmaz. Bir IIS sitesi anonim erişime izin vermeyen bir şekilde yapılandırılmışsa, istek hiçbir zaman uygulamaya ulaşmaz. Bu nedenle özniteliği [AllowAnonymous] geçerli değildir.

Anonim erişime izin ver

Hem Windows Kimlik Doğrulaması hem de anonim erişim etkinleştirildiğinde [[Authorize]](xref:Microsoft.AspNetCore.Authorization.AuthorizeAttribute) ve [AllowAnonymous] özniteliklerini kullanın. [[Authorize]](xref:Microsoft.AspNetCore.Authorization.AuthorizeAttribute) özniteliği, uygulamanın kimlik doğrulaması gerektiren uç noktalarının güvenliğini sağlamanızı sağlar. özniteliği, [AllowAnonymous] anonim erişime [Authorize] izin veren uygulamalarda özniteliği geçersiz kılar. Öznitelik kullanımı ayrıntıları için bkz . ASP.NET Core'da basit yetkilendirme.

Dekont

Varsayılan olarak, bir sayfaya erişim yetkisi olmayan kullanıcılara boş bir HTTP 403 yanıtı sunulur. StatusCodePages Ara Yazılımı, kullanıcılara daha iyi bir "Erişim Reddedildi" deneyimi sağlayacak şekilde yapılandırılabilir.

Kimliğe bürünme

ASP.NET Core kimliğe bürünme uygulamaz. Uygulamalar, uygulama havuzunu veya işlem kimliğini kullanarak tüm istekler için uygulamanın kimliğiyle çalışır. Uygulamanın bir kullanıcı adına bir eylem gerçekleştirmesi gerekiyorsa Windows'ıIdentity kullanın. RunImpersonated veya RunImpersonatedAsync içindeki bir terminal satır içi ara yazılımındaProgram.cs. Bu bağlamda tek bir eylem çalıştırın ve bağlamı kapatın.

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 paketi Windows, Linux ve macOS'ta kimlik doğrulamasını etkinleştirirken, kimliğe bürünme yalnızca Windows'ta desteklenir.

Talep dönüştürmeleri

IIS ile barındırırken, AuthenticateAsync bir kullanıcıyı başlatmak için dahili olarak çağrılmaz. Bu nedenle, her kimlik doğrulamasından sonra talepleri dönüştürmek için kullanılan bir IClaimsTransformation uygulama varsayılan olarak etkinleştirilmez. Daha fazla bilgi ve talep dönüştürmelerini etkinleştiren bir kod örneği için bkz . İşlem içi ve işlem dışı barındırma arasındaki farklar.

Ek kaynaklar

Iis, veya HTTP.sys ile barındırılan ASP.NET Core uygulamaları için Windows Kimlik Doğrulaması (Anlaşma, KestrelKerberos veya NTLM kimlik doğrulaması olarak da bilinir) yapılandırılabilir.

Windows Kimlik Doğrulaması, ASP.NET Core uygulamalarının kullanıcılarının kimliğini doğrulamak için işletim sistemine dayanır. Sunucunuz, kullanıcıları tanımlamak için Active Directory etki alanı kimliklerini veya Windows hesaplarını kullanarak bir şirket ağında çalıştığında Windows Kimlik Doğrulamasını kullanabilirsiniz. Windows Kimlik Doğrulaması, kullanıcıların, istemci uygulamalarının ve web sunucularının aynı Windows etki alanına ait olduğu intranet ortamlarına en uygun olanıdır.

Dekont

Windows Kimlik Doğrulaması HTTP/2 ile desteklenmez. Kimlik doğrulama zorlukları HTTP/2 yanıtlarında gönderilebilir, ancak istemcinin kimlik doğrulamasından önce HTTP/1.1'e düşürmesi gerekir.

Ara sunucu ve yük dengeleyici senaryoları

Windows Kimlik Doğrulaması, öncelikle intranette kullanılan ve bir ara sunucunun veya yük dengeleyicinin genellikle istemciler ve sunucular arasındaki trafiği işlemediği durum bilgisi olan bir senaryodur. Ara sunucu veya yük dengeleyici kullanılıyorsa, Windows Kimlik Doğrulaması yalnızca ara sunucu veya yük dengeleyici:

  • Kimlik doğrulamasını işler.
  • Kullanıcı kimlik doğrulama bilgilerini uygulamaya geçirir (örneğin, bir istek üst bilgisinde), kimlik doğrulama bilgilerine göre hareket eder.

Ara sunucuların ve yük dengeleyicilerin kullanıldığı ortamlarda Windows Kimlik Doğrulaması'nın bir alternatifi, OpenID Bağlan (OIDC) ile Active Directory Federasyon Hizmetleri'dir (ADFS).

IIS/IIS Express

içinde (Microsoft.AspNetCore.Server.IISIntegration ad alanı) Startup.ConfigureServicesçağırarak AddAuthentication kimlik doğrulama hizmetleri ekleyin:

services.AddAuthentication(IISDefaults.AuthenticationScheme);

Başlatma ayarları (hata ayıklayıcı)

Başlatma ayarları yapılandırması yalnızca IIS Express dosyasını etkiler Properties/launchSettings.json ve Windows Kimlik Doğrulaması için IIS'yi yapılandırmaz. Sunucu yapılandırması IIS bölümünde açıklanmıştır.

Visual Studio veya .NET Core CLI aracılığıyla kullanılabilen Web Uygulaması şablonu, dosyayı otomatik olarak güncelleştiren Windows Kimlik Doğrulamasını Properties/launchSettings.json destekleyecek şekilde yapılandırılabilir.

Yeni proje

  1. Yeni bir proje oluşturma.
  2. ASP.NET Çekirdek Web Uygulaması'nı seçin. İleri'yi seçin.
  3. Proje adı alanına bir ad girin. Konum girişinin doğru olduğunu onaylayın veya proje için bir konum belirtin. Oluştur’u seçin.
  4. Kimlik Doğrulaması'nın altında Değiştir'iseçin.
  5. Kimlik Doğrulamasını Değiştir penceresinde Windows Kimlik Doğrulaması'nı seçin. Tamam seçeneğini işaretleyin.
  6. Web Uygulaması'nı seçin.
  7. Oluştur’u seçin.

Uygulamayı çalıştırma. Kullanıcı adı, işlenen uygulamanın kullanıcı arabiriminde görünür.

Mevcut proje

Projenin özellikleri Windows Kimlik Doğrulaması'nı etkinleştirir ve Anonim Kimlik Doğrulamasını devre dışı bırakır:

  1. Çözüm Gezgini'da projeye sağ tıklayın ve Özellikler'i seçin.
  2. Hata Ayıkla sekmesini seçin.
  3. Anonim Kimlik Doğrulamasını Etkinleştir onay kutusunu temizleyin.
  4. Windows Kimlik Doğrulamasını Etkinleştir onay kutusunu seçin.
  5. Özellik sayfasını kaydedin ve kapatın.

Alternatif olarak, özellikler dosyanın düğümünde iisSettingslaunchSettings.json yapılandırılabilir:

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

Mevcut bir projeyi değiştirirken, proje dosyasının Microsoft.AspNetCore.App meta paketiveya Microsoft.AspNetCore.Authentication NuGet paketi için bir paket başvurusu içerdiğini onaylayın.

IIS

IIS, ASP.NET Core uygulamalarını barındırmak için ASP.NET Core Modülünü kullanır. Windows Kimlik Doğrulaması, web.config dosyası aracılığıyla IIS için yapılandırılır. Aşağıdaki bölümlerde nasıl yapılır gösterilmektedir:

  • Uygulama dağıtıldığında sunucuda Windows Kimlik Doğrulamasını etkinleştiren yerel bir web.config dosyası sağlayın.
  • Sunucuya zaten dağıtılmış olan bir ASP.NET Core uygulamasının web.config dosyasını yapılandırmak için IIS Yöneticisi'ni kullanın.

Henüz yapmadıysanız, ASP.NET Core uygulamalarını barındırmak için IIS'yi etkinleştirin. Daha fazla bilgi için bkz . IIS ile Windows'ta Konak ASP.NET Core.

Windows Kimlik Doğrulaması için IIS Rol Hizmeti'ni etkinleştirin. Daha fazla bilgi için bkz . IIS Rol Hizmetleri'nde Windows Kimlik Doğrulamasını Etkinleştirme (bkz. Adım 2).

IIS Tümleştirme Ara Yazılımı , isteklerin kimliğini varsayılan olarak otomatik olarak doğrulayarak yapılandırılır. Daha fazla bilgi için bkz . IIS ile Windows'ta Konak ASP.NET Core: IIS seçenekleri (AutomaticAuthentication).

ASP.NET Çekirdek Modülü, Windows Kimlik Doğrulama belirtecini varsayılan olarak uygulamaya iletecek şekilde yapılandırılır. Daha fazla bilgi için bkz . ASP.NET Çekirdek Modülü yapılandırma başvurusu: aspNetCore öğesinin öznitelikleri.

Aşağıdaki yaklaşımlardan birini kullanın:

  • Projeyi yayımlamadan ve dağıtmadan önce aşağıdaki web.config dosyasını proje köküne ekleyin:

    <?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>
    

    Proje .NET Core SDK'sı tarafından yayımlandığında (özellik proje dosyasında olarak ayarlanmadan <IsTransformWebConfigDisabled>true ), yayımlanan web.config dosyası bölümünü içerir <location><system.webServer><security><authentication> . özelliği hakkında <IsTransformWebConfigDisabled> daha fazla bilgi için bkz . IIS ile Windows'ta Konak ASP.NET Core.

  • Projeyi yayımladıktan ve dağıttığınızda IIS Yöneticisi ile sunucu tarafı yapılandırma gerçekleştirin:

    1. IIS Yöneticisi'nde, Bağlan ions kenar çubuğunun Siteler düğümü altında IIS sitesini seçin.
    2. IIS alanında Kimlik Doğrulaması'na çift tıklayın.
    3. Anonim Kimlik Doğrulaması'ı seçin. Eylemler kenar çubuğunda Devre Dışı Bırak'ı seçin.
    4. Windows Kimlik Doğrulaması'ı seçin. Eylemler kenar çubuğunda Etkinleştir'i seçin.

    Bu eylemler gerçekleştirildiğinde, IIS Yöneticisi uygulamanın web.config dosyasını değiştirir. <system.webServer><security><authentication> ve windowsAuthenticationiçin anonymousAuthentication güncelleştirilmiş ayarlarla bir düğüm eklenir:

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

    <system.webServer> IIS Yöneticisi tarafından web.config dosyasına eklenen bölüm, uygulama <location> yayımlandığında uygulamanın .NET Core SDK'sı tarafından eklenen bölümünün dışındadır. Bölüm düğümün dışına eklendiğinden <location> , ayarlar geçerli uygulamaya herhangi bir alt uygulama tarafından devralınır. Devralmayı önlemek için eklenen <security> bölümü .NET Core SDK'sının <location><system.webServer> sağladığı bölümün içine taşıyın.

    IIS yapılandırmasını eklemek için IIS Yöneticisi kullanıldığında, yalnızca uygulamanın sunucudaki web.config dosyasını etkiler. Sunucunun web.config kopyası projenin web.config dosyasıyla değiştirilirse, uygulamanın sonraki dağıtımı sunucudaki ayarların üzerine yazabilir. Ayarları yönetmek için aşağıdaki yaklaşımlardan birini kullanın:

    • Dağıtımda dosyanın üzerine yazıldıktan sonra web.config dosyasındaki ayarları sıfırlamak için IIS Yöneticisi'ni kullanın.
    • Ayarlarla uygulamaya yerel olarak bir web.config dosyası ekleyin.

Kestrel

Microsoft.AspNetCore.Authentication.Negotiate NuGet paketi, Windows, Linux ve macOS üzerinde Negotiate ve Kerberos kullanarak Windows Kimlik Doğrulamasını desteklemek için ile Kestrel birlikte kullanılabilir.

Uyarı

Kimlik bilgileri bir bağlantıdaki istekler arasında kalıcı hale gelebilir. Ara sunucu ile 1:1 bağlantı benşimini (kalıcı bir bağlantı) korumadığı sürece anlaşma kimlik doğrulaması proxy'lerle Kestrelkullanılmamalıdır.

Dekont

Negotiate işleyicisi, temel sunucunun Windows Kimlik Doğrulamasını yerel olarak destekleyip desteklemediğini ve etkinleştirilip etkinleştirilmediğini algılar. Sunucu Windows Kimlik Doğrulaması'nı destekliyorsa ancak devre dışı bırakıldıysa, sunucu uygulamasını etkinleştirmenizi isteyen bir hata oluşur. Sunucuda Windows Kimlik Doğrulaması etkinleştirildiğinde, Anlaşma işleyicisi kimlik doğrulama isteklerini ona saydam bir şekilde iletir.

ve AddNegotiateStartup.ConfigureServicesöğesini çağırarak AddAuthentication kimlik doğrulama hizmetleri ekleyin:

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

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

içinde Startup.Configurearayarak UseAuthentication Kimlik Doğrulama Ara Yazılımı ekleyin:

app.UseAuthentication();

Ara yazılım hakkında daha fazla bilgi için bkz . ASP.NET Core Ara Yazılımı.

Kerberos kimlik doğrulaması ve rol tabanlı erişim denetimi (RBAC)

Linux veya macOS'ta Kerberos kimlik doğrulaması, kimliği doğrulanmış bir kullanıcı için herhangi bir rol bilgisi sağlamaz. Kerberos kullanıcısına rol ve grup bilgileri eklemek için, kimlik doğrulama işleyicisinin rolleri bir LDAP etki alanından alacak şekilde yapılandırılması gerekir. En temel yapılandırma yalnızca sorgulanacak bir LDAP etki alanını belirtir ve LDAP etki alanını sorgulamak için kimliği doğrulanmış kullanıcının bağlamını kullanır:

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

Bazı yapılandırmalar LDAP etki alanını sorgulamak için belirli kimlik bilgileri gerektirebilir. Kimlik bilgileri aşağıdaki vurgulanmış seçeneklerde belirtilebilir:

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

Varsayılan olarak, anlaşma kimlik doğrulaması işleyicisi iç içe etki alanlarını çözümler. Büyük veya karmaşık bir LDAP ortamında iç içe etki alanlarını çözümlemek, yavaş arama veya her kullanıcı için çok fazla bellek kullanılmasına neden olabilir. İç içe etki alanı çözümleme seçeneği kullanılarak IgnoreNestedGroups devre dışı bırakılabilir.

Anonim isteklere izin verilir. Kimlik doğrulaması için anonim isteklere meydan okumak için ASP.NET Çekirdek Yetkilendirme'yi kullanın.

AuthenticationScheme, Microsoft.AspNetCore.Authentication.Negotiate NuGet paketini gerektirir.

Windows ortamı yapılandırması

Microsoft.AspNetCore.Authentication.Negotiate bileşeni Kullanıcı Modu kimlik doğrulamasını gerçekleştirir. Hizmet Asıl Adları (SPN) makine hesabına değil hizmeti çalıştıran kullanıcı hesabına eklenmelidir. Yönetici komut kabuğunda yürütür setspn -S HTTP/myservername.mydomain.com myuser .

Linux ve macOS ortam yapılandırması

Linux veya macOS makinesini Windows etki alanına ekleme yönergeleri, Windows kimlik doğrulaması - Kerberos kullanarak Azure Data Studio'yu SQL Server'ınıza Bağlan makalesinde bulunabilir. Yönergeler, etki alanındaki Linux makinesi için bir makine hesabı oluşturur. SPN'ler bu makine hesabına eklenmelidir.

Linux veya macOS makinesi etki alanına katıldıktan sonra SPN'lerle bir anahtar sekmesi dosyası sağlamak için ek adımlar gerekir:

  • Etki alanı denetleyicisinde makine hesabına yeni web hizmeti SPN'leri ekleyin:
    • setspn -S HTTP/mywebservice.mydomain.com mymachine
    • setspn -S HTTP/mywebservice@MYDOMAIN.COM mymachine
  • Anahtar sekmesi dosyası oluşturmak için ktpass kullanın:
    • 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
    • Bazı alanlar belirtildiği gibi büyük harfle belirtilmelidir.
  • Anahtar sekmesi dosyasını Linux veya macOS makinesine kopyalayın.
  • Bir ortam değişkeni aracılığıyla tuş sekmesi dosyasını seçin: export KRB5_KTNAME=/tmp/mymachine.HTTP.keytab
  • Şu anda kullanılabilir durumdaki SPN'leri göstermek için çağırın klist .

Dekont

Anahtar sekmesi dosyası etki alanı erişim kimlik bilgilerini içerir ve buna göre korunmalıdır.

HTTP.sys

HTTP.sys Negotiate, NTLM veya Basic kimlik doğrulaması kullanarak Çekirdek Modu Windows Kimlik Doğrulamayı destekler.

içinde (Microsoft.AspNetCore.Server.HttpSys ad alanı) Startup.ConfigureServicesçağırarak AddAuthentication kimlik doğrulama hizmetleri ekleyin:

services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);

Uygulamanın web ana bilgisayarını Http.sys'yi Windows Kimlik Doğrulaması (Program.cs ile) kullanacak şekilde yapılandırın. UseHttpSys ad alanındadır 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;
                    });
            });
}

Dekont

HTTP.sys, Kerberos kimlik doğrulama protokolüyle Çekirdek Modu kimlik doğrulamasına temsilci olarak çalışır. Kullanıcı Modu kimlik doğrulaması Kerberos ve HTTP.sys ile desteklenmez. Makine hesabı, Active Directory'den alınan ve istemci tarafından kullanıcının kimliğini doğrulamak üzere sunucuya iletilen Kerberos belirtecinin/anahtarının şifresini çözmek için kullanılmalıdır. Uygulamanın kullanıcısı için değil konak için Hizmet Asıl Adı'nı (SPN) kaydedin.

Dekont

HTTP.sys, Nano Sunucu sürüm 1709 veya sonraki sürümlerde desteklenmez. Nano Sunucu ile Windows Kimlik Doğrulaması ve HTTP.sys kullanmak için bir Sunucu Çekirdeği (microsoft/windowsservercore) kapsayıcısı kullanın. Sunucu Çekirdeği hakkında daha fazla bilgi için bkz . Windows Server'da Sunucu Çekirdeği yükleme seçeneği nedir?.

Kullanıcıları yetkilendirme

Anonim erişimin yapılandırma durumu, ve [AllowAnonymous] özniteliklerinin uygulamada nasıl [Authorize] kullanılacağını belirler. Aşağıdaki iki bölümde anonim erişimin izin verilmeyen ve izin verilen yapılandırma durumlarının nasıl işleneceğini açıklanmaktadır.

Anonim erişime izin verme

Windows Kimlik Doğrulaması etkinleştirildiğinde ve anonim erişim devre dışı bırakıldığında [Authorize] ve [AllowAnonymous] özniteliklerinin hiçbir etkisi olmaz. Bir IIS sitesi anonim erişime izin vermeyen bir şekilde yapılandırılmışsa, istek hiçbir zaman uygulamaya ulaşmaz. Bu nedenle özniteliği [AllowAnonymous] geçerli değildir.

Anonim erişime izin ver

Hem Windows Kimlik Doğrulaması hem de anonim erişim etkinleştirildiğinde ve [AllowAnonymous] özniteliklerini kullanın[Authorize]. özniteliği, [Authorize] uygulamanın kimlik doğrulaması gerektiren uç noktalarının güvenliğini sağlamanızı sağlar. özniteliği, [AllowAnonymous] anonim erişime [Authorize] izin veren uygulamalarda özniteliği geçersiz kılar. Öznitelik kullanımı ayrıntıları için bkz . ASP.NET Core'da basit yetkilendirme.

Dekont

Varsayılan olarak, bir sayfaya erişim yetkisi olmayan kullanıcılara boş bir HTTP 403 yanıtı sunulur. StatusCodePages Ara Yazılımı, kullanıcılara daha iyi bir "Erişim Reddedildi" deneyimi sağlayacak şekilde yapılandırılabilir.

Kimliğe bürünme

ASP.NET Core kimliğe bürünme uygulamaz. Uygulamalar, uygulama havuzunu veya işlem kimliğini kullanarak tüm istekler için uygulamanın kimliğiyle çalışır. Uygulamanın bir kullanıcı adına bir eylem gerçekleştirmesi gerekiyorsa Windows'ıIdentity kullanın. RunImpersonated veya RunImpersonatedAsync içindeki bir terminal satır içi ara yazılımındaStartup.Configure. Bu bağlamda tek bir eylem çalıştırın ve bağlamı kapatın.

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 paketi Windows, Linux ve macOS'ta kimlik doğrulamasını etkinleştirirken, kimliğe bürünme yalnızca Windows'ta desteklenir.

Talep dönüştürmeleri

IIS ile barındırırken, AuthenticateAsync bir kullanıcıyı başlatmak için dahili olarak çağrılmaz. Bu nedenle, her kimlik doğrulamasından sonra talepleri dönüştürmek için kullanılan bir IClaimsTransformation uygulama varsayılan olarak etkinleştirilmez. Daha fazla bilgi ve talep dönüştürmelerini etkinleştiren bir kod örneği için bkz . İşlem içi ve işlem dışı barındırma arasındaki farklar.

Ek kaynaklar