ASP.NET Core'de Windows Kimlik Doğrulamasını Yapılandırma
Yayımlayanlar Rick Anderson ve Kirk Larkin
Windows Kimlik Doğrulaması (Anlaşma, Kerberos veya NTLM kimlik doğrulaması olarak da bilinir), IIS, Kestrelveya HTTP.sys ile barındırılan ASP.NET Core uygulamaları için 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.
Not
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ı'na alternatif olarak OpenID Connect (OIDC) ile Active Directory Federasyon Hizmetleri (ADFS) kullanılır.
IIS/IIS Express
içinde arayarak Program.cs
AddAuthentication 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 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:
- Çözüm Gezgini'nde projeye sağ tıklayın ve Özellikler paneli öğesini seçin.
- Hata Ayıklama ve Genel sekmesini seçin ve Hata ayıklama başlatma profilleri kullanıcı arabirimini aç'ı seçin.
- Anonim Kimlik Doğrulamasını Etkinleştir onay kutusunu temizleyin.
- Windows Kimlik Doğrulamasını Etkinleştir onay kutusunu seçin.
Alternatif olarak, özellikler dosyanın düğümünde iisSettings
launchSettings.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:
- IIS Yöneticisi'nde, Bağlantılar kenar çubuğunun Siteler düğümü altındaki IIS sitesini seçin.
- IIS alanında Kimlik Doğrulaması'na çift tıklayın.
- Anonim Kimlik Doğrulaması'ı seçin. Eylemler kenar çubuğunda Devre Dışı Bırak'ı seçin.
- 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>
vewindowsAuthentication
içinanonymousAuthentication
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.
Not
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.cs
etkinleş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 Negotiate
gerektirir; istek veya yanıt kimlik doğrulaması üst bilgilerinde doğrudan belirtmeyi NTLM
desteklemez. NTLM içinde Kestreldesteklenir, ancak olarak Negotiate
gö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 NTLM
HTTP
gösterir. HTTP
Kerberos'un kullanıldığını gösterir.
Linux ve macOS ortam yapılandırması
Linux veya macOS makinesini bir Windows etki alanına ekleme yönergeleri, Windows kimlik doğrulamasını kullanarak Azure Data Studio'yu SQL Server'ınıza bağlama - Kerberos makalesinde bulunabilir. Yönergeler, etki alanındaki Linux makinesi için bir makine hesabı oluşturur. SPN'ler bu makine hesabına eklenmelidir.
Not
Azure Data Studio'yu Windows kimlik doğrulaması - Kerberos kullanarak SQL Server'ınıza bağlama makalesindeki yönergeleri takip ederken, gerekirse değerini ile python3-software-properties
değiştirinpython-software-properties
.
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
.
Not
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;
});
}
Not
Kerberos kimlik doğrulama protokolüyle Çekirdek Modu kimlik doğrulamasına temsilci HTTP.sys. 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.
Not
nano sunucu sürüm 1709 veya sonraki sürümlerde HTTP.sys desteklenmez. Nano Sunucu ile Windows Kimlik Doğrulaması ve HTTP.sys kullanmak için sunucu çekirdeği (microsoft/windowsservercore) kapsayıcısı kullanın (bkz https://hub.docker.com/_/microsoft-windows-servercore
. ). 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.
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 sağlayacak şekilde yapılandırılabilir.
Kimliğe bürünme
ASP.NET Core kimliğe bürünme uygulamaz. Uygulamalar, uygulama identity havuzunu veya işlemi identitykullanarak tüm istekler için uygulama ile çalışır. Uygulamanın bir kullanıcı adına bir eylem gerçekleştirmesi gerekiyorsa, WindowsIdentity.RunImpersonated veya RunImpersonatedAsync içindeki bir terminal satır içi ara yazılımında Program.cs
kullanın. 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
Windows Kimlik Doğrulaması (Anlaşma, Kerberos veya NTLM kimlik doğrulaması olarak da bilinir), IIS, Kestrelveya HTTP.sys ile barındırılan ASP.NET Core uygulamaları için 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.
Not
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ı'na alternatif olarak OpenID Connect (OIDC) ile Active Directory Federasyon Hizmetleri (ADFS) kullanılır.
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 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
- Yeni bir proje oluşturma.
- ASP.NET Çekirdek Web Uygulaması'nı seçin. İleri'yi seçin.
- 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 belirleyin.
- Kimlik Doğrulaması'nın altında Değiştir'i seçin.
- Kimlik Doğrulamasını Değiştir penceresinde Windows Kimlik Doğrulaması'nı seçin. Tamam'ı seçin.
- Web Uygulaması'nı seçin.
- Oluştur'u belirleyin.
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:
- Çözüm Gezgini'da projeye sağ tıklayın ve Özellikler'i seçin.
- Hata Ayıkla sekmesini seçin.
- Anonim Kimlik Doğrulamasını Etkinleştir onay kutusunu temizleyin.
- Windows Kimlik Doğrulamasını Etkinleştir onay kutusunu seçin.
- Özellik sayfasını kaydedin ve kapatın.
Alternatif olarak, özellikler dosyanın düğümünde iisSettings
launchSettings.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 paketi veya 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:
- IIS Yöneticisi'nde, Bağlantılar kenar çubuğunun Siteler düğümü altındaki IIS sitesini seçin.
- IIS alanında Kimlik Doğrulaması'na çift tıklayın.
- Anonim Kimlik Doğrulaması'ı seçin. Eylemler kenar çubuğunda Devre Dışı Bırak'ı seçin.
- 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>
vewindowsAuthentication
içinanonymousAuthentication
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.
Not
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 AddNegotiate Startup.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.Configure
arayarak 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 bir Windows etki alanına ekleme yönergeleri, Windows kimlik doğrulamasını kullanarak Azure Data Studio'yu SQL Server'ınıza bağlama - Kerberos makalesinde bulunabilir. Yönergeler, etki alanındaki Linux makinesi için bir makine hesabı oluşturur. SPN'ler bu makine hesabına eklenmelidir.
Not
Azure Data Studio'yu Windows kimlik doğrulaması - Kerberos kullanarak SQL Server'ınıza bağlama makalesindeki yönergeleri takip ederken, gerekirse değerini ile python3-software-properties
değiştirinpython-software-properties
.
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
.
Not
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 konağını Windows Kimlik Doğrulaması (Program.cs
) ile HTTP.sys 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;
});
});
}
Not
Kerberos kimlik doğrulama protokolüyle Çekirdek Modu kimlik doğrulamasına temsilci HTTP.sys. 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.
Not
nano sunucu sürüm 1709 veya sonraki sürümlerde HTTP.sys desteklenmez. Nano Sunucu ile Windows Kimlik Doğrulaması ve HTTP.sys kullanmak için sunucu çekirdeği (microsoft/windowsservercore) kapsayıcısı kullanın (bkz https://hub.docker.com/_/microsoft-windows-servercore
. ). 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.
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 sağlayacak şekilde yapılandırılabilir.
Kimliğe bürünme
ASP.NET Core kimliğe bürünme uygulamaz. Uygulamalar, uygulama identity havuzunu veya işlemi identitykullanarak tüm istekler için uygulama ile çalışır. Uygulamanın bir kullanıcı adına bir eylem gerçekleştirmesi gerekiyorsa, WindowsIdentity.RunImpersonated veya RunImpersonatedAsync içindeki bir terminal satır içi ara yazılımında Startup.Configure
kullanın. 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
ASP.NET Core