Logowanie nie powiodło się dla użytkownika „DOMAIN \ MACHINENAME $”


120

Wiem, że jest to prawie duplikat: Błąd „Logowanie nie powiodło się dla użytkownika„ NT AUTHORITY \ IUSR ”” w ASP.NET i SQL Server 2008 i logowanie nie powiodło się dla użytkownika „nazwa_użytkownika” - System.Data.SqlClient.SqlException z LINQ w zewnętrzna biblioteka projektów / klas, ale niektóre rzeczy nie sumują się w porównaniu z innymi aplikacjami na moim serwerze i nie wiem dlaczego.

Używane pudełka:

Pole testowe
SQL Box w sieci Web

Moja aplikacja:

Mam aplikację sieci Web ASP.NET, która odwołuje się do biblioteki klas, która używa LINQ-to-SQL. Parametry połączenia skonfigurowane poprawnie w bibliotece klas. Zgodnie z logowaniem nie powiodło się dla użytkownika „nazwa użytkownika” - System.Data.SqlClient.SqlException z LINQ w zewnętrznej bibliotece projektu / klasy , dodałem również ten ciąg połączenia do aplikacji internetowej.

Parametry połączenia używają poświadczeń SQL jako takich (w aplikacji internetowej i bibliotece klas):

 <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" />

Potwierdzono, że połączenie działa poprzez dodanie go do Eksploratora serwera. To są parametry połączenia, których używa mój plik .dbml.

Problem:

Otrzymuję następujący błąd:

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

Teraz odwołując się do tego Błąd „Logowanie nie powiodło się dla użytkownika 'NT AUTHORITY \ IUSR'” w ASP.NET i SQL Server 2008 mówi, że to naprawdę usługa sieci lokalnej i użycie jakiejkolwiek innej nazwy spoza domeny nie będzie działać.

Ale jestem zdezorientowany, ponieważ sprawdziłem zarówno SQL Box, jak i SQL Test Box SQL Management Studio i oba mają NT AUTHORITY/NETWORK SERVICEpod Security -> Logins, na poziomie bazy danych, które nie są wymienione w Security -> Users, ale na poziomie bazy danych Security -> Użytkownicy Mam użytkownika wyświetlanego w ciągu połączenia.

Na poziomie NTFS na serwerze sieciowym uprawnienia mają USŁUGA SIECIOWA ma pełną kontrolę.

Powodem, dla którego jestem zdezorientowany, jest to, że mam wiele innych aplikacji internetowych na moim serwerze sieciowym, które odwołują się do baz danych zarówno w SQL Box, jak i SQL Test Box i wszystkie działają. Ale nie mogę znaleźć różnicy między nimi a moją obecną aplikacją, poza tym, że używam biblioteki klas. Czy to ma znaczenie? Sprawdzanie uprawnień NTFS, konfiguracja logowania zabezpieczeń na poziomie serwera i baz danych, parametry połączenia i metoda łączenia (poświadczenia programu SQL Server), pula aplikacji IIS i inne opcje folderów są takie same.

Dlaczego te aplikacje działają bez dodawania nazwy maszyny $ do uprawnień któregokolwiek z moich pól SQL? Ale to właśnie nakazuje mi jedno łącze, aby rozwiązać ten problem.


Podsumowując, nie używasz użytkownika bazy danych? Tworzymy jeden i możemy przełączać się między nim a SA w zależności od tego, co musimy zrobić ...
jcolebrand

W ciągu połączenia używam użytkownika bazy danych, którego utworzyłem w obszarze Security -> Logins, dodałem go do Security -> users bazy danych i nadałem mu uprawnienia dbo. Tak też zrobiłem wszystkie moje inne aplikacje.
SventoryMang

Oto jasne wyjaśnienie z MSDN przy użyciu domyślnej nazwy komputera, po prostu dodajesz domenę / maszynę $ do sql bez wciskania wyszukiwania. blogs.msdn.microsoft.com/ericparvin/2015/04/14/…
Brett Maiwald

Odpowiedzi:


156

USŁUGA SIECIOWA i system lokalny będą zawsze uwierzytelniać się lokalnie jako odpowiednie konto (usługa wbudowana \ usługa sieciowa i \ system wbudowany), ale oba będą uwierzytelniać się zdalnie jako konto komputera.

Jeśli zobaczysz błąd, na przykład Login failed for user 'DOMAIN\MACHINENAME$'oznacza to, że proces działający jako USŁUGA SIECIOWA lub jako system lokalny uzyskał dostęp do zdalnego zasobu, uwierzytelnił się jako konto komputera i odmówiono mu autoryzacji.

Typowym przykładem może być aplikacja ASP działająca w puli aplikacji skonfigurowana do korzystania z poświadczeń usługi NETWORK SERVICE i łącząca się ze zdalnym serwerem SQL: pula aplikacji zostanie uwierzytelniona jako maszyna z uruchomioną pulą aplikacji i czy to konto komputera musi mieć przyznany dostęp .

W przypadku odmowy dostępu do konta komputera należy udzielić dostępu do konta komputera. Jeśli serwer odmówi zalogowania się do „DOMENA \ MASZYNA $”, należy nadać prawa logowania do „DOMENA \ MASZYNA $”, a nie do USŁUGI SIECIOWEJ. Przyznanie dostępu do USŁUGI SIECIOWEJ umożliwiłoby połączenie procesowi lokalnemu działającemu jako USŁUGA SIECIOWA, a nie zdalnemu, ponieważ zdalny będzie uwierzytelniał się tak, jak zgadłeś, DOMENA \ MASZYNA $.

Jeśli spodziewasz się, że aplikacja asp będzie łączyć się ze zdalnym serwerem SQL jako login SQL i otrzymujesz wyjątki dotyczące DOMAIN \ MACHINE $, oznacza to, że w parametrach połączenia używasz zintegrowanych zabezpieczeń. Jeśli jest to nieoczekiwane, oznacza to, że zepsułeś parametry połączenia, których używasz.


2
Właśnie to zebrałem, dziękuję za wyjaśnienie. Jednak nadal pozostaje pytanie, wszystkie moje aplikacje są hostowane na moim serwerze sieciowym, ale mają dostęp do bazy danych na polach SQL lub SQL Test, to byłby dostęp zdalny, tak? Jednak działają ... ale żadne z moich pól SQL nie przyznaje dostępu DOMENA \ NAZWA MASZYNY $.
SventoryMang

1
Och, spodziewam się również, że połączę się z serwerem SQL jako login SQL, ale opublikowałem parametry połączenia, nie używam opcji Integrated Security = True, co jeszcze mogłoby to być?
SventoryMang

2
Istnieją trzy możliwe wyjaśnienia: 1) używają uwierzytelniania SQL zamiast zintegrowanego uwierzytelniania (który wydaje się być najbardziej prawdopodobny, ponieważ przykładowo ma identyfikator użytkownika i hasło w ciągu połączenia) 2) używają zintegrowanego uwierzytelniania i uruchamiają w ankiecie aplikacji który używa innego poświadczenia lub 3) używają zintegrowanego uwierzytelniania, ale aplikacja ASP personifikuje wywołującego, wyzwalając w ten sposób ograniczone delegowanie: technet.microsoft.com/en-us/library/cc739587%28WS.10%29.aspx .
Remus Rusanu

2
Projekt aplikacji internetowej powinien odwoływać się do projektu biblioteki klas , a nie do biblioteki dll. Dodaj projekt biblioteki klas do rozwiązania aplikacji sieci Web, a następnie usuń odwołanie do biblioteki dll i dodaj odwołanie do projektu. W ten sposób podczas wdrażania lub testowania detaliczna aplikacja internetowa będzie odwoływać się do biblioteki DLL klasy detalicznej, a debugowanie będzie odwoływać się do debugowania automatycznie.
Remus Rusanu

1
Chociaż wszystko jest w porządku, jak dodać login maszyny do SQL? - Oba znajdują się w tej samej domenie i wolałbym używać zintegrowanych zabezpieczeń. Ale samo dodanie konta o nazwie „Domain \ MachineName $” kończy się niepowodzeniem (na przykład nie istnieje, a eksplorator obiektów dławi się i nie znajduje czegoś takiego).
BrainSlugs83

33

Ten błąd występuje, gdy skonfigurowano aplikację z usługami IIS, a usługi IIS przechodzą do programu SQL Server i próbują zalogować się przy użyciu poświadczeń, które nie mają odpowiednich uprawnień. Ten błąd może również wystąpić podczas konfigurowania replikacji lub dublowania. Omówię rozwiązanie, które zawsze działa i jest bardzo proste. Przejdź do SQL Server >> Security >> Logins i kliknij prawym przyciskiem myszy NT AUTHORITY \ NETWORK SERVICE i wybierz Właściwości

Na nowo otwartym ekranie Właściwości logowania przejdź do zakładki „Mapowanie użytkowników”. Następnie w zakładce „User Mapping” należy wybrać żądaną bazę danych - w szczególności bazę danych, dla której wyświetlany jest ten komunikat o błędzie. Na dolnym ekranie zaznacz rolę db_owner. Kliknij OK.


7
To było dla mnie rozwiązanie, ponieważ aplikacja internetowa i baza danych znajdują się na tym samym komputerze. Nadal pojawia się błąd „Logowanie nie powiodło się dla użytkownika„ DOMENA \ NAZWA MASZYNY $ ”, ale dodanie komputera do logowania SQL nie pomogło, ale dodanie„ ZARZĄDZANIE NT \ USŁUGA SIECIOWA ”pomogło. Chociaż nie powinieneś używać roli db_owner, chyba że jest to potrzebne, wystarczające są zwykłe db_datareader i db_datawriter.
JimiSweden

18

W moim przypadku miałem Identity="ApplicationPoolIdentity"dla mojej puli aplikacji IIS.

Po dodaniu IIS APPPOOL\ApplicationNameużytkownika do SQL Server to działa.


5
Uważam, że zadziała to tylko wtedy, gdy IIS i serwer SQL znajdują się na tym samym komputerze.
Rob Davis

1
To zadziałało dla mnie! Mam konfigurację lokalnego serwera IIS-SQL.
Vin Shahrdar

1
Dziękuję Ci bardzo. Ten problem zaczął się dla mnie po uaktualnieniu mojego lokalnego środowiska deweloperskiego z SQL Server 2014 do 2017. Twoja sugestia była najlepszym rozwiązaniem w tej sytuacji.
MFry

Dzięki, dla mnie też pracował. Chciałbym podkreślić, że komunikat o błędzie nadal brzmi „Logowanie nie powiodło się dla użytkownika„ DOMENA \ NAZWA MASZYNY $ ”, mimo że pula aplikacji jest ustawiona na uruchamianie z tożsamością puli, a logowanie kończy się niepowodzeniem, nawet jeśli„ DOMENA \ NAZWA MASZYNY $ ”faktycznie otrzyma uprawnienia do połączenia. Wydaje mi się, że komunikat o błędzie wprowadza w błąd.
mivra

16

Zasadniczo, aby rozwiązać ten problem, musimy skonfigurować coś takiego jak

  • Aplikacja internetowa działa w ramach ApplicationPoolIdentity
  • Aplikacja internetowa łączy się z bazami danych przez ADO.Net przy użyciu uwierzytelniania systemu Windows w ciągu połączenia

Parametry połączenia używane z uwierzytelnianiem systemu Windows obejmują Trusted_Connection=Yesatrybut lub równoważny atrybut Integrated Security=SSPIw Web.configpliku

Moje połączenie z bazą danych jest w trybie uwierzytelniania systemu Windows. Więc postanowiłem go po prostu zmieniając Pule aplikacji Identity od ApplicationPoolIdentity do mojego dziennika w poświadczeń domeny NazwaDomeny \ MyloginId

Krok:

  1. Kliknij Pule aplikacji
  2. Wybierz nazwę swojej aplikacji

  3. Przejdź do ustawień zaawansowanych

  4. Rozwiń Model procesu i kliknij Tożsamość . Kliknij trzy kropki na prawym końcu.
  5. Kliknij przycisk Ustaw ... i podaj poświadczenia logowania do domeny

Dla mnie to zostało rozwiązane.

Uwaga: W środowisku produkcyjnym lub IT możesz mieć konto usługi w tej samej domenie dla tożsamości puli aplikacji. Jeśli tak, użyj konta usługi zamiast loginu.


Na powyższe pytanie powinna być przyjęta odpowiedź.
makil

14

Sztuczka, która zadziałała dla mnie, polegała na usunięciu Integrated Securityz moich parametrów połączenia i dodaniu zwykłych parametrów User ID=userName; Password=passwordpołączenia w App.configlutym może nie używać zintegrowanych zabezpieczeń, ale ten utworzony w Web.configjest!


3
Miliard podziękowań dla ciebie. Ogromna pomoc. Dziekuję Dziekuję Dziękuję. Jest to, jestem pewien, bardzo oczywiste, ale dla przyszłych ludzi jest to identyfikator użytkownika = coś; Hasło = coś;
shubniggurath

2
Otrzymałem ten sam błąd w tytule posta. Zauważyłem, że „Identyfikator użytkownika = twoje hasło użytkownika = twoje hasło” jest ignorowane, gdy w ciągu połączenia z bazą danych znajduje się „zaufane połączenie = prawda”. Usunąłem „zaufane połączenie = prawda” z mojego ciągu i to rozwiązało mój problem. Tak się stało, dopóki nie przeniosłem aplikacji z debugowania w VS 2012 do iis 8.
T3.0.

12

Kolega miał ten sam błąd i wynikało to z małego błędu konfiguracji w IIS.
Do aplikacji internetowej została przypisana niewłaściwa pula aplikacji.

Rzeczywiście używamy niestandardowej puli aplikacji z określoną tożsamością, aby zaspokoić nasze potrzeby.

W jego lokalnym Menedżerze IIS -> Witryny -> Domyślna witryna internetowa -> Nazwa naszej aplikacji internetowej -> Ustawienia podstawowe ... Pula aplikacji to „DefaultAppPool” zamiast naszej niestandardowej puli aplikacji.

Ustawienie poprawnej puli aplikacji rozwiązało problem.


11

Dodałem <identity impersonate="true" />do mojego web.config i działało dobrze.


7
Wystarczy zrozumieć, że spowoduje to zmianę kontekstu, w którym aplikacja ASP.NET działa w całości. Zamiast działać w domyślnym kontekście „USŁUGA SIECIOWA”, będzie teraz działać w kontekście użytkownika korzystającego z aplikacji (tj. Domena \ jakiś użytkownik). Czasami jest to w porządku, ale po prostu zrozum, że ta zmiana nie jest tylko szybką naprawą PO i ma inne konsekwencje, które mogą / mogą nie być pożądane.
atconway


6

U mnie problem został rozwiązany, kiedy zastąpiłem domyślne konto wbudowane „ApplicationPoolIdentity” kontem sieciowym, które miało dostęp do bazy danych.

Ustawienia można wprowadzić w Internet Information Server (IIS 7+)> Pule aplikacji> Zaawansowane ustawienia> Model procesu> Tożsamość


4

Dla mnie problem z „DOMENA \ NAZWA MASZYNY $” naprawiony przez ustawienie DefaultApplicationPooltożsamości na NetworkService.

wprowadź opis obrazu tutaj


3

Otrzymywaliśmy podobne komunikaty o błędach podczas przetwarzania bazy danych usług Analysis Services. Okazało się, że nazwa użytkownika, która była używana do uruchamiania wystąpienia usług Analysis Services, nie została dodana do logowania zabezpieczeń SQL Server.

W programie SQL Server 2012 usługi SQL Server i Analysis są domyślnie skonfigurowane do uruchamiania jako różni użytkownicy. Jeśli wybrałeś ustawienia domyślne, zawsze upewnij się, że użytkownik AS ma dostęp do twojego źródła danych!


1
Miałem ten sam problem. Błąd z SSAS jest taki sam, ale konto nie jest usługą sieciową. Konto to w rzeczywistości: NT Service \ MSOLAP $ INSTANCENAME
cdonner

2

Sprawdź, czy masz

User Instance=true

w ciągu połączenia. Spróbuj go usunąć, co rozwiąże problem.


2

Miałem również ten błąd z uwierzytelnionym użytkownikiem SQL Server

Wypróbowałem kilka poprawek, ale nie zadziałały.

Rozwiązaniem w moim przypadku było skonfigurowanie jego „trybu uwierzytelniania serwera”, aby umożliwić uwierzytelnianie SQL Server w Management Studio: Właściwości / Bezpieczeństwo.


1

Jedyną kwestią, którą wszyscy przeoczyli, jest to, że możesz chcieć, aby zintegrowane zabezpieczenia = prawda. Witryna może działać w ramach konta puli. Wszystko w porządku, więc nadal można trafić na serwer SQL z oryginalnymi danymi użytkownika, a nie z pulą. Nazywa się to delegacją ograniczoną. Jeśli ją włączysz i skonfigurujesz SPN, okna będą tłumaczyć poświadczenia puli z użytkownikami na żądania kierowane do usługi końcowej (SQL jest tylko jedną z takich usług). Musisz zarejestrować JEDEN I TYLKO serwer SQL obsługujący żądania SQL na serwerze WWW. Ustawienie tego wszystkiego jest dla mnie zbyt trudne, abym starał się dokładnie opisać to tutaj. Zajęło mi to trochę czasu, zanim sam to przepracowałem.


0

Spędziłem kilka godzin próbując rozwiązać problem iw końcu udało mi się to - przeglądarka SQL Server została „zatrzymana”. Poprawka polega na zmianie trybu na „Automatyczny”:

Jeśli jest wyłączony, przejdź do Panel sterowania-> Narzędzia administracyjne-> Usługi i poszukaj agenta SQL Server. Kliknij prawym przyciskiem myszy i wybierz „Właściwości”. W menu „Typ uruchomienia” zmień z „Wyłączony” na „Automatyczny”.

cytat stąd


0

Miałem ten sam problem wcześniej, usunięcie Persist Security Info=Truez connectionstring działało dla mnie.


0

Napotkałem ten problem, gdy klient zmienił nazwę serwera SQL. Usługa SQL Reporting Service została skonfigurowana tak, aby łączyć się ze starą nazwą serwera, dla którego utworzono również alias dla tego przekierowanego na adres IP nowej nazwy serwera.

Wszystkie ich stare aplikacje IIS działały, przekierowując do nowej nazwy serwera za pośrednictwem aliasu. W pewnym sensie sprawdziłem, czy mają SSRS. Próba połączenia się z witryną SSRS. Wystąpił błąd:

„Usługa jest niedostępna. Skontaktuj się z administratorem systemu, aby rozwiązać ten problem. Administratorzy systemu: serwer raportów nie może połączyć się ze swoją bazą danych. Upewnij się, że baza danych jest uruchomiona i dostępna. Szczegółowe informacje można również sprawdzić w dzienniku śledzenia serwera raportów ”.

Działał na serwerze, ale nie mógł się połączyć, ponieważ używał aliasu dla starej nazwy serwera. Ponowna konfiguracja usług SSRS, aby używała nowej nazwy serwera zamiast starej / aliasu, naprawiła problem.


0
  1. Zmień tożsamość puli aplikacji na system lokalny
  2. Zarządzanie SQL> Bezpieczeństwo> Loginy
    1. Znajdź ZARZĄDZANIE NT \ SYSTEM, kliknij dwukrotnie
    2. Mapowania użytkowników> Sprawdź swoją bazę danych i nadaj jej rolę poniżej.
    3. Pamiętaj również o stworzeniu bazy danych użytkowników o bezpiecznych loginach z poprawnym hasłem.

0

Wystąpił ten błąd podczas próby przetestowania rozwiązania przy użyciu następującego

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

Sposób, w jaki rozwiązałem, był następujący: musiałem otworzyć Visual Studio i uruchomić go na innym koncie, ponieważ konto, którego użyłem do otwarcia, nie było moim kontem administratora.

Więc jeśli twój problem jest podobny do mojego: przypnij VS do paska zadań, a następnie użyj klawisza Shift i prawego przycisku myszy, aby otworzyć menu, aby móc otworzyć VS jako inny użytkownik. wprowadź opis obrazu tutaj


0

Doceniam, że jest tutaj kilka dobrych odpowiedzi, ale ponieważ właśnie straciłem czas na rozwiązywanie tego, mam nadzieję, że może to komuś pomóc.

W moim przypadku wszystko działało dobrze, po czym zatrzymało się bez wyraźnego powodu z błędem podanym w pytaniu.

Usługi IIS działały jako usługa sieciowa, a usługa sieciowa została wcześniej skonfigurowana na serwerze SQL (zobacz inne odpowiedzi do tego postu). Role serwera i mapowania użytkowników wyglądały poprawnie.

Problem był; bez żadnego wyraźnego powodu; Usługa sieciowa zmieniła uprawnienia logowania w bazie danych na „Odmów”.

Naprawić:

  1. Otwórz SSMS> Bezpieczeństwo> Loginy.
  2. Kliknij prawym przyciskiem myszy „ZARZĄDZANIE NT \ USŁUGA SIECIOWA” i kliknij Właściwości.
  3. Przejdź do zakładki „Status” i ustaw Permission to Connect To Database Engine„Grant”.

Usługa sieciowa dozwolona

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.