ASP.NET Core 'da Windows kimlik doğrulamasını yapılandırma

Scott Ade tarafından

Windows kimlik doğrulaması (Negotiate, Kerberos veya NTLM kimlik doğrulaması olarak da bilinir), IIS, Kestrelveya HTTP.sysile barındırılan ASP.NET Core uygulamalar için yapılandırılabilir.

Windows kimlik doğrulaması (Negotiate, Kerberos veya NTLM kimlik doğrulaması olarak da bilinir), IIS veya HTTP.sysile barındırılan ASP.NET Core uygulamalar için yapılandırılabilir.

Windows kimlik doğrulaması, ASP.NET Core uygulama kullanıcılarının kimliğini doğrulamak için işletim sistemini kullanır. Sunucunuz, kullanıcıları tanımlamak için Active Directory etki alanı kimliklerini veya Windows hesaplarını kullanarak bir kurumsal ağda ç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ı için idealdir.

Not

Windows kimlik doğrulaması, HTTP/2 ile desteklenmez. Kimlik doğrulaması sorunları HTTP/2 Yanıtlarına gönderilebilir, ancak kimlik doğrulamadan önce istemci HTTP/1.1 sürümüne indirgenmelidir.

Proxy ve yük dengeleyici senaryoları

Windows kimlik doğrulaması, birincil olarak bir intranette kullanılan ve bir ara sunucu veya yük dengeleyicinin istemciler ve sunucular arasındaki trafiği genellikle işlemeyen bir durum bilgisi olan senaryodur. Bir ara sunucu veya yük dengeleyici kullanılırsa, Windows kimlik doğrulaması yalnızca proxy veya yük dengeleyici için geçerlidir:

  • Kimlik doğrulamasını işler.
  • Kullanıcı kimlik doğrulama bilgilerini uygulamaya geçirir (örneğin, bir istek üstbilgisinde), kimlik doğrulama bilgileri üzerinde davranır.

Proxy 'lerin ve yük dengeleyicilerin kullanıldığı ortamlarda Windows kimlik doğrulamasına alternatif olarak, OpenID Connect (OıDC) ile Federasyon Hizmetleri (ADFS) Active Directory.

IIS/IIS Express

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

services.AddAuthentication(IISDefaults.AuthenticationScheme);

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

Başlatma ayarları için yapılandırma yalnızca IIS Express dosya üzerindeki özellikleri/launchSettings.js etkiler 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 ile kullanılabilen Web uygulaması şablonu, Windows kimlik doğrulamasını destekleyecek şekilde yapılandırılabilir ve bu, dosyadaki özellikleri/launchSettings.js otomatik olarak güncelleştirir.

Yeni proje

  1. Yeni bir proje oluşturma.
  2. ASP.NET Core 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ıaltında Değiştir ' i seçin.
  5. Kimlik doğrulamasını Değiştir penceresinde, Windows kimlik doğrulaması' nı seçin. Tamam’ı seçin.
  6. Web uygulaması' nı seçin.
  7. Oluştur’u seçin.

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

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 ' de projeye sağ tıklayın ve Özellikler' i seçin.
  2. Hata Ayıkla sekmesini seçin.
  3. Anonim kimlik doğrulamasını etkinleştironay kutusunun işaretini kaldırın.
  4. Windows kimlik doğrulamasını etkinleştironay kutusunu işaretleyin.
  5. Özellik sayfasını kaydedin ve kapatın.

Alternatif olarak, Özellikler iisSettings dosyadaki launchSettings.js düğümünde 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 metapackage veya Microsoft. aspnetcore. Authentication NuGet paketi için bir paket başvurusu içerdiğini doğrulayı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 aşağıdakilerin nasıl yapılacağı gösterilmektedir:

  • Uygulama dağıtıldığında sunucuda Windows kimlik doğrulamasını etkinleştiren bir yerel web.config dosyası sağlayın.
  • Sunucuda zaten dağıtılan bir ASP.NET Core uygulamasının web.config dosyasını YAPıLANDıRMAK Için IIS Yöneticisi 'ni kullanın.

Daha önce yapmadıysanız, IIS 'yi ASP.NET Core uygulamaları barındıracak şekilde etkinleştirin. Daha fazla bilgi için bkz. IIS ASP.NET Core Windows konak konakları.

Windows kimlik doğrulaması için IIS rol hizmetini etkinleştirin. Daha fazla bilgi için bkz. IIS rol hizmetlerinde Windows kimlik doğrulamasını etkinleştirme (bkz. 2. adım).

IIS tümleştirme ara yazılımı , varsayılan olarak isteklerin kimliğini otomatik olarak doğrulamak için yapılandırılır. Daha fazla bilgi için bkz. IIS Ile Windows üzerinde ana bilgisayar ASP.NET Core: IIS seçenekleri (Automatıcauthentication).

ASP.NET Core modülü, Windows kimlik doğrulama belirtecini varsayılan olarak uygulamaya iletecek şekilde yapılandırılmıştır. Daha fazla bilgi için bkz. ASP.NET Core modülü yapılandırma başvurusu: aspNetCore öğesinin öznitelikleri.

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

  • Projeyi yayımlamadan ve dağıtmaya başlamadan ö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 ( <IsTransformWebConfigDisabled> Proje dosyasında özelliği olarak ayarlanmış olmayan) tarafından yayımlandığında true , yayımlanan web.config dosyası <location><system.webServer><security><authentication> bölümünü içerir. Özelliği hakkında daha fazla bilgi için <IsTransformWebConfigDisabled> bkz IIS ASP.NET Core Windows konak konakları ..

  • Projeyi yayımladıktan ve dağıttıktan sonra IIS yöneticisiyle sunucu tarafı yapılandırması gerçekleştirin:

    1. IIS Yöneticisi 'nde, Bağlantılar kenar çubuğu ' nun sıteler 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ınıseçin. Eylemler kenar çubuğunda devre dışı bırak ' ı seçin.
    4. Windows kimlik doğrulaması' nı seçin. Eylemler kenar çubuğunda Etkinleştir ' i seçin.

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

    <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, <location> uygulama yayımlandığında .NET Core SDK tarafından eklenen uygulama bölümünün dışındadır. Bölüm düğümün dışına eklendiğinden <location> , ayarlar herhangi bir alt uygulama tarafından geçerli uygulamaya devralınır. Devralmayı önlemek için, eklenen <security> bölümü <location><system.webServer> .NET Core SDK bölümün içine taşıyın.

    IIS Yöneticisi IIS yapılandırmasını eklemek için kullanıldığında, yalnızca sunucudaki web.config dosyasını etkiler. Sunucunun web.config kopyası projenin web.config dosyası tarafından 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ım sırasında dosyanın üzerine yazıldıktan sonra web.config dosyasındaki ayarları SıFıRLAMAK Için IIS Yöneticisi 'ni kullanın.
    • Ayarlarla yerel olarak uygulamaya bir web.config dosyası ekleyin.

Kestrel

Windows, Linux ve macOS 'ta Negotiate ve Kerberos kullanarak Windows kimlik doğrulamasını desteklemek için Microsoft. AspNetCore. Authentication. Negotiate NuGet paketi Kestrel ile birlikte kullanılabilir.

Uyarı

Kimlik bilgileri bir bağlantı üzerindeki istekler arasında kalıcı olabilir. Proxy, Kestrel ile bir 1:1 bağlantı benzeşimi (kalıcı bağlantı) tutmadığı müddetçe, Negotiate kimlik doğrulaması proxy ile kullanılmamalıdır.

Not

Negotiate işleyicisi, temeldeki 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ışıysa sunucu uygulamasını etkinleştirmenizi isteyen bir hata oluşur. Sunucuda Windows kimlik doğrulaması etkinleştirildiğinde, anlaşma işleyicisi saydam olarak buna iletilir.

Ve ' i çağırarak kimlik doğrulama hizmetleri ekleyin AddAuthentication AddNegotiate Startup.ConfigureServices :

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

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

Şunları çağırarak kimlik doğrulama ara yazılımı ekleyin UseAuthentication Startup.Configure :

app.UseAuthentication();

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

Anonim isteklere izin verilir. Kimlik doğrulaması için anonim istekleri zorluk ASP.NET Core yetkilendirmeyi kullanın.

Windows ortam yapılandırması

Microsoft. AspNetCore. Authentication. Negotiate bileşeni, Kullanıcı modu kimlik doğrulaması gerçekleştirir. Hizmet sorumlusu adları (SPN 'Ler) makine hesabını değil, hizmeti çalıştıran kullanıcı hesabına eklenmelidir. setspn -S HTTP/myservername.mydomain.com myuserYönetim komut kabuğu 'nda yürütün.

Linux ve macOS ortam yapılandırması

Linux veya macOS makinesini bir Windows etki alanına katılmaya yönelik yönergeler, Windows kimlik doğrulaması-Kerberos makalesini kullanarak SQL Server Azure Data Studio bağlanma ' da kullanılabilir. Yönergeler, etki alanındaki Linux makinesi için bir makine hesabı oluşturur. SPN 'Ler bu makine hesabına eklenmelidir.

Not

Windows kimlik doğrulaması-Kerberos makalesini kullanarak SQL Server Azure Data Studio bağlanma ' daki kılavuzdan sonra, python-software-properties gerekirse öğesini ile değiştirin python3-software-properties .

Linux veya macOS makinesi etki alanına katıldığında, SPN 'Ler içeren bir keytab 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
  • Bir keytab 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ın gösterildiği gibi büyük harfle belirtilmesi gerekir.
  • Keytab dosyasını Linux veya macOS makinesine kopyalayın.
  • Bir ortam değişkeni aracılığıyla keytab dosyasını seçin:export KRB5_KTNAME=/tmp/mymachine.HTTP.keytab
  • klistŞu anda kullanılabilecek SPN 'leri göstermek için çağırın.

Not

Bir keytab dosyası, etki alanı erişimi kimlik bilgilerini içerir ve buna uygun şekilde korunması gerekir.

HTTP.sys

HTTP.sys , NEGOTIATE, NTLM veya temel kimlik doğrulaması kullanarak çekirdek modu Windows kimlik doğrulamasını destekler.

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

services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);

Uygulamanın Web konağını, Windows kimlik doğrulaması (program.cs) ile HTTP.sys kullanacak şekilde yapılandırın. UseHttpSysMicrosoft.AspNetCore.Server.HttpSysad alanında.

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

Not

Kerberos kimlik doğrulama protokolü ile çekirdek modu kimlik doğrulamasına temsilciler HTTP.sys. Kullanıcı modu kimlik doğrulaması, Kerberos ve HTTP.sys desteklenmez. Makine hesabı, Active Directory alındığı ve kullanıcının kimliğini doğrulamak için istemci tarafından sunucuya iletilen Kerberos belirtecinin/biletinin şifresini çözmek için kullanılmalıdır. Uygulamanın kullanıcısına değil, ana bilgisayar için hizmet asıl adını (SPN) kaydedin.

Not

HTTP.sys nano sunucu 1709 veya sonraki bir sürümde desteklenmez. Windows kimlik doğrulaması 'nı ve nano sunucu ile 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ı yetkilendir

Anonim erişimin yapılandırma durumu, [Authorize] ve [AllowAnonymous] özniteliklerinin uygulamada kullanılma şeklini 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ği 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 etkisi yoktur. Bir IIS sitesi anonim erişime izin vermeyecek şekilde yapılandırıldıysa, istek uygulamaya hiçbir şekilde ulaşmaz. Bu nedenle, [AllowAnonymous] öznitelik geçerli değildir.

Anonim erişime izin ver

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

Not

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 sunacak şekilde yapılandırılabilir.

Kimliğe bürünme

ASP.NET Core kimliğe bürünme uygulamaz. Uygulamalar, uygulama havuzu veya işlem kimliği 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, içindeki bir Terminal satır içi ara yazılım Içinde WindowsIdentity. runınkimliğine bürünme kullanın Startup.Configure . Bu bağlamda tek bir eylem çalıştırın ve sonra 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());
    }
});

RunImpersonated, zaman uyumsuz işlemleri desteklemez ve karmaşık senaryolar için kullanılmamalıdır. Örneğin, tüm isteklerin veya ara yazılım zincirlerinin sarmalanması desteklenmez veya önerilmez.

Microsoft. AspNetCore. Authentication. Negotiate paketi Windows, Linux ve MacOS 'ta kimlik doğrulamaya izin sağlarken, kimliğe bürünme yalnızca Windows 'da desteklenir.

Talep dönüşümleri

IIS ile barındırırken, AuthenticateAsync bir kullanıcıyı başlatmak için dahili olarak çağrılmaz. Bu nedenle, IClaimsTransformation her kimlik doğrulaması sonrasında talepleri dönüştürmek için kullanılan bir uygulama varsayılan olarak etkinleştirilmez. Daha fazla bilgi ve talep dönüştürmelerini etkinleştiren bir kod örneği için bkz ASP.NET Core Modülü ..

IIS işlem içi modunda barındırırken, AuthenticateAsync bir kullanıcıyı başlatmak için dahili olarak çağrılmaz. Bu nedenle, IClaimsTransformation her kimlik doğrulaması sonrasında talepleri dönüştürmek için kullanılan bir uygulama varsayılan olarak etkinleştirilmez. İşlem içinde barındırırken talep dönüştürmelerini etkinleştiren daha fazla bilgi ve kod örneği için bkz ASP.NET Core Modülü ..

Ek kaynaklar