'DOMAIN \ MACHINENAME $' kullanıcısı için oturum açma başarısız oldu


120

: Ben bu neredeyse kopyası olduğunu biliyorum ASP.NET ve SQL Server 2008 yılında "Oturum açma 'NT AUTHORITY \ IUSR' için başarısız oldu" hatası ve LINQ ile System.Data.SqlClient.SqlException içinde - kullanıcı 'kullanıcı adı' için başarısız Girişi harici proje / sınıf kitaplığı ancak sunucumdaki diğer uygulamalara kıyasla bazı şeyler eklenmiyor ve neden olduğundan emin değilim.

Kullanılan kutular:

Web Kutusu
SQL Kutusu
SQL Test Kutusu

Başvurum:

LINQ-to-SQL kullanan bir sınıf kitaplığına başvuran bir ASP.NET Web Uygulamam var. Bağlantı dizesi, sınıf kitaplığında doğru şekilde ayarlandı. Gereğince Oturum açma 'kullanıcı adı' için başarısız oldu - dış projede LINQ ile System.Data.SqlClient.SqlException / sınıf kütüphanesi Ayrıca Web Uygulaması için bu bağlantı dizesi ekledi.

Bağlantı dizesi SQL kimlik bilgilerini şu şekilde kullanır (hem web uygulamasında hem de sınıf kitaplığında):

 <add name="Namespace.My.MySettings.ConnectionStringProduction"
        connectionString="Data Source=(SQL Test Box);Initial Catalog=(db name);Persist Security Info=True;User ID=ID;Password=Password"
        providerName="System.Data.SqlClient" />

Bu bağlantının Sunucu Gezgini'ne eklenerek çalıştığı onaylandı. Bu .dbml dosyamın kullandığı bağlantı dizesi.

Sorun:

Şu hatayı alıyorum:

System.Data.SqlClient.SqlException: Login failed for user 'DOMAIN\MACHINENAME$'.

Şimdi buna referans vermek ASP.NET ve SQL Server 2008'de "'NT AUTHORITY \ IUSR' kullanıcısı için oturum açma başarısız oldu" hatası , bunun gerçekten yerel ağ hizmeti olduğunu ve başka herhangi bir etki alanı olmayan adın kullanılmayacağını söylüyor.

Ama kafam karıştı çünkü hem SQL Box hem de SQL Test Box SQL Management Studio ve her ikisinin de NT AUTHORITY/NETWORK SERVICEGüvenlik -> Girişler altında, veritabanı düzeyinde, Güvenlik -> Kullanıcılar altında listelenmemiş, ancak Güvenlik düzeyinde -> Kullanıcılar Bağlantı dizesinde kullanıcıyı görüntüledim.

Web sunucusunda NTFS düzeyinde, izinler NETWORK SERVICE'in tam denetimine sahiptir.

Kafamın karışık olmasının nedeni, Web Sunucumda hem SQL Kutusu hem de SQL Test Kutusundaki veritabanlarına başvuran birçok başka web uygulamasının olması ve hepsinin çalışmasıdır. Ancak sınıf kitaplığı kullanmam dışında onlarla mevcut uygulamam arasında bir fark bulamıyorum. Bu önemli mi? NTFS izinlerini, sunucu ve veritabanı düzeylerinde Güvenlik Oturum Açma ayarlarını, bağlantı dizesini ve bağlanma yöntemini (SQL Server kimlik bilgileri) ve IIS uygulama havuzunu ve diğer klasör seçeneklerini kontrol etmek, hepsi aynıdır.

Bu uygulamalar neden SQL kutularımdan birinin izinlerine makine adı $ eklemeden çalışıyor? Ama tek bağlantı bana bu sorunu çözmek için yapmamı söylediği şey.


Özetlemek gerekirse, bir veritabanı kullanıcısı kullanmıyorsunuz? Bir tane yaratıyoruz ve ne yapmamız gerektiğine bağlı olarak onunla SA arasında geçiş yapabiliyoruz ...
jcolebrand

Bağlantı dizesinde, Güvenlik -> Oturum Açma alanında oluşturduğum bir veritabanı kullanıcısını kullanıyorum, veritabanının Güvenlik -> kullanıcılarına ekledim ve ona dbo izinleri verdim. Ben de diğer tüm uygulamalarımı böyle yaptım.
SventoryMang

Burada, varsayılan makine adını kullanan MSDN'den net bir açıklama var, temelde sadece alan adını / makineyi $ 'ı sql'ye, aramaya basmadan eklersiniz. blogs.msdn.microsoft.com/ericparvin/2015/04/14/…
Brett Maiwald

Yanıtlar:


156

NETWORK SERVICE ve LocalSystem her zaman yerel olarak karşılık gelen hesap olarak kendilerini doğrular (yerleşik \ ağ hizmeti ve yerleşik \ sistem) ancak her ikisi de uzaktan makine hesabı olarak kimlik doğrulaması yapar.

Login failed for user 'DOMAIN\MACHINENAME$'Bunun gibi bir hata görürseniz , NETWORK SERVICE veya LocalSystem olarak çalışan bir işlemin uzak bir kaynağa eriştiği, kendisini makine hesabı olarak doğruladığı ve yetkisinin reddedildiği anlamına gelir.

Tipik bir örnek, NETWORK SERVICE kimlik bilgilerini kullanmak için bir uygulama havuzunda çalışan ve uzak bir SQL Sunucusuna bağlanan bir ASP uygulaması olabilir: uygulama havuzu, uygulama havuzunu çalıştıran makine olarak kimlik doğrulaması yapar ve erişim verilmesi gereken bu makine hesabıdır .

Bir makine hesabına erişim reddedildiğinde, makine hesabına erişim izni verilmelidir. Sunucu 'DOMAIN \ MACHINE $' oturum açmayı reddederse, NETWORK SERVICE'e değil 'DOMAIN \ MACHINE $' için oturum açma haklarını vermelisiniz. NETWORK SERVICE'e erişim izni vermek, NETWORK SERVICE olarak çalışan yerel bir işlemin uzak bir sürecin değil, bağlanmasına izin verir , çünkü uzak olanın, tahmin ettiğiniz gibi, DOMAIN \ MACHINE $ kimliğini doğrulayacaktır.

Asp uygulamasının uzak SQL Server'a bir SQL oturumu olarak bağlanmasını bekliyorsanız ve DOMAIN \ MACHINE $ hakkında istisnalar alıyorsanız, bu bağlantı dizesinde Integrated Security kullandığınız anlamına gelir. Bu beklenmedik bir şeyse, kullandığınız bağlantı dizelerini bozmuşsunuz demektir.


2
Doğru, topladığım şey, açıklama için teşekkür ederim. Bununla birlikte, soru hala devam ediyor, tüm uygulamalarım Web Sunucumda barındırılıyor ancak SQL veya SQL Test kutularındaki bir veritabanına erişiyor, bu uzaktan erişim olur, evet? Yine de çalışıyorlar ... ancak SQL kutularımdan hiçbiri DOMAIN \ MACHINENAME $ erişimi sağlamıyor.
SventoryMang

1
Ayrıca, SQL sunucusuna bir SQL Oturumu olarak bağlanmayı bekliyorum ama bağlantı dizelerimi gönderdim, Integrated Security = True seçeneğini kullanmıyorum, başka ne olabilir?
SventoryMang

2
Üç olası açıklama vardır: 1) entegre yetkilendirme yerine SQL kimlik doğrulamasını kullanıyorlar (ki bu en mantıklı olanı, örneğin bağlantı dizesinde bir kullanıcı kimliği ve parolası olduğundan) 2) entegre kimlik doğrulama kullanıyorlar ve bir uygulama anketinde çalışıyorlar farklı bir kimlik bilgisi kullanan veya 3) entegre kimlik doğrulama kullanıyorlar ancak ASP uygulaması arayan kişiyi temsil ediyor, böylece kısıtlı yetkilendirmeyi tetikliyor: technet.microsoft.com/en-us/library/cc739587%28WS.10%29.aspx .
Remus Rusanu

2
Web uygulaması projeniz dll'ye değil, sınıf kitaplığı projesine başvurmalıdır. Sınıf kitaplığı projesini web uygulaması çözümüne ekleyin, ardından dll'ye olan başvuruyu kaldırın ve projeye başvuru ekleyin. Bu şekilde, dağıtırken veya test ederken, perakende web uygulaması perakende sınıfı dll'ye başvurur ve hata ayıklama, hata ayıklamaya otomatik olarak başvurur.
Remus Rusanu

1
Her şey yolunda ve güzel olsa da, makine oturum açma bilgilerini SQL'e nasıl eklersiniz? - İkisi de aynı etki alanında ve entegre güvenliği kullanmayı tercih ederim. Ancak "EtkiAlanı \ MakineAdı $" adlı bir hesabın eklenmesi tamamen başarısız olur (örneğin, mevcut değil ve nesne gezgini tıkanır ve buna benzer bir şey bulamaz).
BrainSlugs83

33

Bu hata, uygulamanızı IIS ile yapılandırdığınızda ve IIS, SQL Server'a gidip uygun izinlere sahip olmayan kimlik bilgileriyle oturum açmaya çalıştığında oluşur. Bu hata, çoğaltma veya aynalama kurulduğunda da ortaya çıkabilir. Her zaman işe yarayan ve çok basit bir çözümün üzerinden geçeceğim. SQL Server >> Güvenlik >> Girişler'e gidin ve NT AUTHORITY \ NETWORK SERVICE'e sağ tıklayın ve Özellikler'i seçin.

Oturum Açma Özelliklerinin yeni açılan ekranında, “Kullanıcı Eşleştirme” sekmesine gidin. Ardından, "Kullanıcı Eşleştirme" sekmesinde, istenen veritabanını seçin - özellikle bu hata mesajının görüntülendiği veritabanını. Alt ekranda, db_owner rolünü kontrol edin. Tamam'ı tıklayın.


7
Web uygulaması ve veritabanı aynı makinede olduğundan benim için çözüm buydu. Hala "'DOMAIN \ MACHINENAME $ adlı kullanıcı için oturum açılamadı" hatası alıyorum, ancak makineyi SQL oturumlarına eklemek yardımcı olmadı, ancak "NT AUTHORITY \ NETWORK SERVICE" eklenmesi işe yaradı. Gerekmedikçe db_owner rolünü kullanmamalısınız, ancak normal olarak db_datareader ve db_datawriter yeterlidir.
JimiSweden

18

Benim durumumda Identity="ApplicationPoolIdentity"IIS Uygulama Havuzum vardı .

IIS APPPOOL\ApplicationNameSQL Server'a kullanıcı ekledikten sonra çalışıyor.


5
Bunun yalnızca IIS ve SQL sunucusu aynı makinedeyse işe yarayacağına inanıyorum.
Rob Davis

1
Bu benim için çalıştı! Yerel bir IIS-SQL sunucu kurulumum var.
Vin Shahrdar

1
Çok teşekkür ederim. Bu sorun benim için yerel geliştirme ortamımı SQL Server 2014'ten 2017'ye yükselttikten sonra başladı. Bu durumda öneriniz sihirli değnek oldu.
MFry

Teşekkürler, benim için de çalıştı. Vurgulamak istediğim şey, uygulama havuzu havuz kimliği altında çalışacak şekilde ayarlanmasına ve oturum açma işlemi "DOMAIN \ MACHINENAME $" aslında "DOMAIN \ MACHINENAME $" altında çalışmasına rağmen hala "DOMAIN \ MACHINENAME $ adlı kullanıcı için oturum açılamadı" hata mesajıdır. bağlanma izinleri verilir. Bana yanıltıcı bir hata mesajı gibi geliyor.
mivra

16

Temel olarak bunu çözmek için bazı ayarlamalar yapmamız gerekiyor.

  • ApplicationPoolIdentity Altında Çalışan Web Uygulaması
  • Bağlantı dizesinde Windows Kimlik Doğrulaması kullanılarak ADO.Net aracılığıyla veritabanlarına bağlanan Web Uygulaması

Windows kimlik doğrulaması ile kullanılan bağlantı dizesi , dosyadaki Trusted_Connection=Yesözniteliği veya eşdeğer özniteliği içerirIntegrated Security=SSPIWeb.config

Veritabanı bağlantım Windows Kimlik Doğrulama modunda. Bu yüzden, Uygulama Havuzları Kimliğini ApplicationPoolIdentity'den etki alanı oturum açma kimlik bilgilerim DomainName \ MyloginId olarak değiştirerek çözdüm.

Adım:

  1. Uygulama Havuzlarına tıklayın
  2. Uygulamanızın adını seçin

  3. Gelişmiş Ayarlara Git

  4. İşlem Modeli'ni genişletin ve Kimlik'i tıklayın . Sağ uçtaki üç noktayı tıklayın.
  5. Click Set ... düğmesi ve kimlik alan adı kaydını sağlayın

Benim için çözüldü.

Not: Üretim veya BT ortamında, uygulama havuzu kimliği için aynı etki alanı altında hizmet hesabınız olabilir. Öyleyse, oturum açma bilgileriniz yerine hizmet hesabı kullanın.


Yukarıdaki soru için bu kabul edilen cevap olmalıdır.
makil

14

Benim için çalıştı hüner kaldırmak oldu Integrated Securitybenim bağlantı dizesinden ve düzenli bir ekleme User ID=userName; Password=passwordde bağlantı dizesi App.configentegre güvenlik fakat oluşturulan birini kullanarak olmayacak senin libruary kudretinin Web.configolduğunu!


3
Size bir milyar teşekkür ederim. Çok büyük yardım. Teşekkürler teşekkürler teşekkürler. Bu, eminim, çok açık ama gelecekteki millet için Kullanıcı Kimliği = bir şey; Şifre = şey;
shubniggurath

2
Yazının başlığında da aynı hatayı alıyordum. Veritabanı bağlantı dizesinde "'güvenilen bağlantı = true'" olduğunda 'Kullanıcı Kimliği = Kullanıcı Şifreniz = Parolanız' göz ardı edildiğini buldum. Dizimden "'güvenilir bağlantı = true'" öğesini kaldırdım ve bu sorunumu çözdü. Bu, uygulamayı VS 2012'de hata ayıklamadan iis 8'e
taşıyana

12

Bir meslektaşta da aynı hata vardı ve bunun nedeni IIS'deki küçük bir yapılandırma hatasıydı.
Web uygulaması için yanlış Uygulama Havuzu atandı.

Aslında, ihtiyaçlarımızı karşılamak için belirli bir Kimliğe sahip özel bir Uygulama Havuzu kullanıyoruz.

Yerel IIS Yöneticisi -> Siteler -> Varsayılan Web Sitesi -> Web Uygulamamızın Adı -> Temel Ayarlar ... Uygulama Havuzu, özel Uygulama Havuzumuz yerine "DefaultAppPool" idi.

Doğru uygulama havuzunu ayarlamak sorunu çözdü.


11

<identity impersonate="true" />Web.config dosyama ekledim ve sorunsuz çalıştı.


7
Bunun, ASP.NET uygulamasının bütünüyle altında çalıştığı bağlamı değiştireceğini anlayın. Varsayılan 'NETWORK SERVICE' bağlamı altında çalıştırmak yerine, artık uygulamayı kullanan kullanıcının bağlamı altında çalışacaktır (ör. EtkiAlanı \ birKullanıcı). Bu bazen sorun değil, ancak bu değişikliğin sadece OP için hızlı bir düzeltme olmadığını ve istenebilecek / istenmeyebilecek diğer aşağı akış etkilerine sahip olduğunu anlayın.
atconway


6

Benim için sorun, varsayılan yerleşik 'ApplicationPoolIdentity' hesabını veritabanına erişime izin verilen bir ağ hesabıyla değiştirdiğimde çözüldü.

Ayarlar İnternet Bilgi Sunucusu (IIS 7+)> Uygulama Havuzları> Gelişmiş Ayarlar> İşlem Modeli> Kimlik bölümünden yapılabilir.


4

Benim için 'DOMAIN \ MACHINENAME $' ile ilgili sorun, DefaultApplicationPoolKimlik olarak ayarlanarak düzeltildi NetworkService.

görüntü açıklamasını buraya girin


3

Analysis Services veritabanını işlerken benzer hata mesajları alıyorduk. Analysis Services örneğini çalıştırmak için kullanılan kullanıcı adının SQL Server'ın Güvenlik Girişlerine eklenmediği ortaya çıktı.

SQL Server 2012'de, SQL Server ve Analysis hizmetleri varsayılan olarak farklı kullanıcılar olarak çalışacak şekilde yapılandırılmıştır. Varsayılanları seçtiyseniz, her zaman AS kullanıcısının veri kaynağınıza erişimi olduğundan emin olun!


1
Ben de aynı sorunu yaşadım. SSAS'den gelen hata aynı, ancak hesap Ağ Hizmeti değil. Hesap aslında şu
şekildedir

2

Sahip olup olmadığını kontrol et

User Instance=true

bağlantı dizesinde. Sorununuzu çözecek olanı kaldırmayı deneyin.


2

Bu hatayı SQL Server kimliği doğrulanmış bir kullanıcıyla da aldım

Bazı düzeltmeleri denedim ama işe yaramadı.

Benim durumumdaki çözüm, Management Studio: Özellikler / Güvenlik altında SQL Server kimlik doğrulamasına izin vermek için "Sunucu Kimlik Doğrulama Modu" nu yapılandırmaktı.


1

Herkesin gözden kaçırdığı tek nokta, entegre güvenlik = doğru isteyebileceğinizdir. Siteyi bir havuz hesabı altında çalıştırabilirsiniz. Her şey yolunda ve SQL sunucusuna havuzun değil, orijinal kullanıcı kimlik bilgileriyle ulaşmak hala mümkün. Buna kısıtlı yetkilendirme denir. Bunu etkinleştirirseniz ve bir SPN penceresi ayarlarsanız, havuzun kimlik bilgilerini, kullanıcının son hizmete giden istekleri ile çevirir (SQL böyle bir hizmetten yalnızca biridir). Web sunucusunda SQL isteklerine hizmet veren BİR VE YALNIZCA SQL sunucusunu kaydetmeniz gerekir. Bunların hepsini ayarlamak, burada doğru bir şekilde tarif etmeye çalışmak için çok fazla. Kendi başıma halletmem epey zaman aldı.


0

Sorunu çözmek için birkaç saat harcadım ve sonunda anladım - SQL Server Tarayıcısı "Durduruldu". Çözüm, "Otomatik" moda geçmektir:

Devre dışı bırakılmışsa, Denetim Masası-> Yönetimsel Araçlar-> Hizmetler'e gidin ve SQL Server Aracısını arayın. Sağ tıklayın ve "Özellikler" i seçin. "Başlangıç ​​Türü" açılır listesinden, "Devre Dışı" dan "Otomatik" e değiştirin.

buradan alıntı


0

Aynı sorunu daha önce yaşadım Persist Security Info=True, bağlantı dizisinden çıkarmak benim için çalıştı.


0

Bir istemci bir SQL Sunucusunu yeniden adlandırdığında bu sorunla karşılaştım. SQL Raporlama Hizmeti, yeni sunucu adının IP'sine yeniden yönlendirilenler için bir takma ad da oluşturdukları eski sunucu adına bağlanmak üzere yapılandırıldı.

Tüm eski IIS uygulamaları çalışıyor, yeni sunucu adına diğer ad üzerinden yönlendiriliyordu. Bir önseziyle, SSRS çalıştırıp çalıştırmadıklarını kontrol ettim. SSRS sitesine bağlanma girişimi şu hatayı verdi:

"Hizmet kullanılamıyor. Sorunu çözmek için sistem yöneticinizle iletişime geçin. Sistem yöneticileri: Rapor sunucusu veritabanına bağlanamıyor. Veritabanının çalıştığından ve erişilebilir olduğundan emin olun. Ayrıntılar için rapor sunucusu izleme günlüğünü de kontrol edebilirsiniz. . "

Sunucuda çalışıyordu, ancak eski sunucu adı için takma adı kullandığı için bağlanamıyordu. SSRS'yi eski / takma ad yerine yeni sunucu adını kullanacak şekilde yeniden yapılandırmak sorunu çözdü.


0
  1. Uygulama Havuzu Kimliğini Yerel Sistem Olarak Değiştirin
  2. SQL Mgmt> Güvenlik> Oturum Açmalarında
    1. NT AUTHORITY \ SYSTEM'i bulun çift tıklama
    2. Kullanıcı Eşlemeleri> Veritabanınızı kontrol edin ve aşağıda ona bir rol verin.
    3. Ayrıca doğru şifre ile güvenlik girişleri için kullanıcı veri tabanı oluşturmayı da unutmayın.

0

Aşağıdakileri kullanarak bir çözümü test etmeye çalışırken bu hatayı aldım

string cn = "Data Source=[servername];Integrated Security=true;Initial Catalog=[dbname];";

Çözdüğüm yol şuydu: Visual Studio'yu açmam ve başka bir hesap altında çalıştırmam gerekiyordu, çünkü açmak için kullandığım hesap benim Yönetici hesabım değildi.

Dolayısıyla, sorununuz benimkine benziyorsa: VS'yi görev çubuğuna sabitleyin, ardından menüyü açmak için Shift ve Sağ Tık'ı kullanın, böylece VS'yi başka bir kullanıcı olarak açabilirsiniz. görüntü açıklamasını buraya girin


0

Burada birkaç iyi cevap var, takdir ediyorum, ancak bu konuda çalışırken zaman kaybettiğim için umarım bu birisine yardımcı olabilir.

Benim durumumda, her şey yolunda gidiyordu, sonra soruda belirtilen hatayla görünür bir sebep olmadan durdu.

IIS, Ağ hizmeti olarak çalışıyordu ve Ağ Hizmeti daha önce SQL Server'da kurulmuştu (bu yazının diğer yanıtlarına bakın). Sunucu rolleri ve kullanıcı eşlemeleri doğru görünüyordu.

Sorun şuydu; kesinlikle görünür bir neden yokken; Ağ Hizmeti, veritabanında Oturum Açma haklarını 'Reddet' olarak değiştirdi.

Düzeltmek:

  1. SSMS> Güvenlik> Girişler'i açın.
  2. 'NT AUTHORITY \ NETWORK SERVICE' üzerine sağ tıklayın ve Özellikler'e tıklayın.
  3. "Durum" sekmesine gidin ve Permission to Connect To Database Engine"Ver" olarak ayarlayın .

Ağ Hizmetine İzin Verildi


0

Buraya yeni bir cevap eklemek, çünkü önceki cevaplar sahip olduğum sorunu açıklamıyordu. Sorun, SQL'de gerekli olan kullanıcı adının uygulama havuzunun adı değil, kimliği olmasıdır. .

IIS'de AppPools ApplicationPoolIdentitykimliğine ayarlanmış olarak çalıştım .

Erişime sahip SQL Güvenliği Kullanıcı adım çağrıldı IIS APPPOOL\DefaultAppPoolve bir ASP.NET Full Framework .net uygulamasıyla sorunsuz çalışıyordu.

ASP.NET Core uygulamamı başlatırken, uygulama adıyla yeni bir AppPool oluşturdu, ancak CLR sürümü yok ve hala aynı ApplicationPoolIdentity kimliği .

Ancak kullanılan kullanıcı adına baktıktan sonra System.Security.Principal.WindowsIdentity.GetCurrent().Name, bunun DefaultAppPool'u değil, yeni uygulama havuzu adını kullandığını fark ettim. Bu yüzden IIS APPPOOL\ApplicationName, SQL güvenlik sekmesinden çağrılan yeni bir kullanıcı eklemem gerekiyordu , varsayılan değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.