2009-05-18 11 views
9


SQLException: Logowanie nie powiodło się dla użytkownika „NT AUTHORITY NETWORK SERVICE

Kiedy uruchomić aplikację internetową za pośrednictwem VS 2008, aplikacja jest w stanie zalogować się na serwerze SQL i sprawdzić poświadczenia (nazwa użytkownika i hasło) wprowadzonych przez użytkownika, ale kiedy przejść do tej aplikacji za pośrednictwem IIS 7 i spróbuj ogłaszanie nazwę użytkownika i hasło, aplikacja zgłasza wyjątek:

System.Data.SqlClient.SqlException: Logowanie nie powiodło się dla użytkownika „SERVICE NT \ NETWORK "

  • W przypadku IIS 7 każdy proces jest uruchamiany pod kontem Network Service ... więc jakie prawa muszę przypisać do tego konta dla aplikacji, aby móc "skontaktować się" z serwerem Sql?


thanx


EDIT:

Witam,


Działa teraz, chociaż nie rozumiem, dlaczego konto komputera potrzebuje tych uprawnień. Rozumiem, że konto urządzenia wymaga pewnych uprawnień, aby móc "rozmawiać" z określonym programem (serwerem Sql), ale dlaczego potrzebuje uprawnień dostępu do bazy danych i jej tabel? Czy to nie do konta określonego w ciągu połączenia

<add name="MyConnection" connectionString="data source=localhost; integrated security=sspi; initial catalog=aspnetdb;" /> 

mieć odpowiednie prawa dostępu do bazy danych i jej tabel?

+2

SourceC, ciąg połączenia nie stosuje specyficzną kombinację login/hasło, stąd jest za pomocą programu Windows Integrated Security. Podczas korzystania z funkcji Integrated Security w ciągu połączenia aplikacja łączy się z bazą danych przy użyciu konta, na którym działa pula aplikacji aplikacji sieci Web. Jeśli chcesz użyć tożsamości osoby dzwoniącej, musisz przeczytać o podszywaniu się pod ASP.NET - nie polecam tego, mimo że istnieją różne wady stosowania tego podejścia. Zamiast tego możesz użyć kombinacji nazwy użytkownika w łańcuchu połączenia, w zależności od wymagań. – RichardOD

Odpowiedz

19

Będziesz musiał utworzyć konto w SQL Server dla konta usługi sieciowej. Następnie przyznasz mu dostęp do bazy danych, a konkretne uprawnienia, którym udzielane jest konto, zależą od charakteru zadań, które musi wykonać twoja baza danych.

Możesz to zrobić w SSMS poprzez sekcję "Bezpieczeństwo", kliknij prawym przyciskiem myszy "Logowania" i wybierz Dodaj. Będziesz dodawać konto Windows, możesz następnie wyszukać i potwierdzić nazwę "NETWORK SERVICE". Następnie przejdź do sekcji "Mapowanie użytkownika" i zezwól na przeglądanie bazy danych. Uprawnienia, jak już powiedziałem, zależą od Ciebie lub możesz przypisać im uprawnienia dbowner do pełnej kontroli.

Po wykonaniu tej czynności wszystko będzie dobrze. Ostrzegam przed przyznaniem aplikacji więcej uprawnień niż potrzeba!

+0

dzięki, to mi bardzo pomogło. :) –

3

Zalecam utworzenie konta usługi i przeprowadzenie procesu IIS 7 jako tego konta. Upewnij się, że konto ma prawidłowy dostęp do DB (jeśli tylko czyta, to DB-Reader) (jeśli czyta i aktualizuje to DB-Reader i DB-Writer).

9

Osobiście uruchomiłbym aplikację internetową pod niestandardowym kontem usługi. Jeśli naprawdę chcesz go uruchomić w ramach usługi sieciowej - see this MSDN document.

8

Podczas określania "integrated security = sspi" w ciągu połączenia, niż myślę, że spodziewasz się podszywania się. Ale do tego należy: 1. Włącz zintegrowane uwierzytelnianie w IIS 2.włączyć okien uwierzytelniania w ASP.NET: 3. Włącz imerposation w ASP.NET:

również pod uwagę, że to nie wystarczy, jeśli serwer WWW i maszyna SQL Server są różne maszyny. W takim przypadku konto użytkownika będzie wymagało zaufania do delegowania. Jest to specjalna opcja w AD.

Powiedziano Ci już, że lepiej jest mieć oddzielne konto dla połączeń SQLSRV. Mam nadzieję, że to pomoże.

+0

Więc kiedy loguję się (jako użytkownik U) Sql serwer poprzez studio zarządzania serwerami Sql, studio zarządzania serwerem (lub inna usługa) przyjmuje tożsamość użytkownika U? Jeśli tak, to zakładam, że serwer Sql nie tylko wymaga, aby proces P1 (który próbuje "rozmawiać" z tym serwerem Sql) zapewnia odpowiednie poświadczenia (nazwa użytkownika U1 i hasło), ale także wymaga, aby P1 działał również jako użytkownik U1? Ale dlaczego serwer Sql wymaga od P1 podania odpowiednich danych uwierzytelniających? Dlaczego nie sprawdza się tylko, czy P1 działa jako U1, a jeśli tak, niech P1 "w" ?! – SourceC

+0

Przepraszam, ale upewnij się, że rozumiesz, co to jest podszywanie się pod inne osoby. Sprawdź to: http://msdn.microsoft.com/en-us/library/ms998351.aspx http://www.infosysblogs.com/microsoft/2009/02/impersonation_and_delegation_t.html – Shrike

2

Napotkano ten sam błąd w nowej konfiguracji IIS. Użyłem "integrated security = false, User Id = sa, Password = yourpassword" i wszystko działało dobrze.

+0

Użytkownik s powinien być zarezerwowany do zadań administracyjnych. – GnomeCubed

1

Ten błąd występuje po skonfigurowaniu aplikacji z usługami IIS, a serwer IIS przechodzi do programu SQL Server i próbuje zalogować się za pomocą poświadczeń, które nie mają odpowiednich uprawnień. Ten błąd może również wystąpić podczas konfigurowania replikacji lub tworzenia kopii lustrzanej.

Będę omawiać rozwiązanie, które działa zawsze i jest bardzo proste.

idź do SQL Server >> Zabezpieczenia >> logowania i kliknij prawym przyciskiem myszy na NT \ Network Service i wybierz Właściwości

W nowo otwartym ekranie logowania Właściwości, przejdź do zakładki „User Mapping”. Następnie na karcie "Mapowanie użytkownika" wybierz żądaną bazę danych - szczególnie bazę danych, dla której wyświetlany jest ten komunikat o błędzie. Na dolnym ekranie sprawdź rolę db_owner. Kliknij OK.

0

Napotkano ten problem w projekcie SharePoint. Zintegrowane zabezpieczenia były włączone, a baza danych została już skonfigurowana, aby umożliwić dostęp użytkownikowi aplikacji.

Problem polegał na tym, że podszywanie się pod numer zostało zmienione na, kiedy trzeba było wyłączyć. This answer doprowadziły mnie we właściwym kierunku:

WindowsImpersonationContext noImpersonateContext = null; 

try 
{ 
    noImpersonateContext = WindowsIdentity.Impersonate(IntPtr.Zero); 
    using (SqlConnection conn = CreateConnection()) 
    { 
     // database calls... 
    } 
} 
finally 
{ 
    if (noImpersonateContext != null) noImpersonateContext.Undo(); 
} 
Powiązane problemy