2012-12-04 5 views
11

Mam aplikację ASP.NET 4.0, w ramach której muszę przekazywać uwierzytelnianie do bazy danych. Na potrzeby tego wniosku o pomoc, zadzwoń do serwera WWW "app1" i serwera bazy danych "sql1".Kerberos double-hop w ASP.NET 4.0 i SQL2008R2

Usługa bazy danych SQL2008R2 działa jako nazwana instancja "SQL2008R2" pod niestandardowym kontem domeny "SqlServer". Na serwerze działa system Windows Server 2008 R2 Enterprise Edition. I stworzyli SPN do tego ...

setspn -a MSSQLSvc/sql1.mydomain.local:SQL2008R2 SqlServer 

aplikacyjny ASP.NET działa w ramach puli aplikacji przy użyciu konta domeny niestandardowej „WebApplicationUser”, w trybie zintegrowanym rurociągu. Obecnie działa na moim laptopie z systemem Windows 7 Enterprise, ale docelowo będzie hostowany w systemie Windows Server 2008 R2 Standard Edition. Stworzyłem 2 SPN dla aplikacji (na komputerze z systemem Windows 7, że jestem aktualnie uruchomionego z) ...

setspn -a http/app1 WebApplicationUser 
setspn -a http/app1.mydomain.local WebApplicationUser 

w usłudze Active Directory Users i komputery, to wybrałeś "WebApplicationUser" konto i mam włączono ograniczoną delegację do "MSSQLSvc/sql1.mydomain.local: SQL2008R2" przy użyciu dowolnego protokołu (próbowałem również używać tylko protokołu Kerbero).

Aplikacja jest skonfigurowana w IIS 7.5, a uwierzytelnianie jest ustawione na wyłączanie anonimowości, podstawowego, skrótów i formularzy przy włączonej opcji "Podszywanie się pod ASP.NET" i "Windows". Uwierzytelnienie systemu Windows ma wyłączoną funkcję "Rozszerzona ochrona" i włączone "Uwierzytelnianie w trybie jądra". Dostawcy są "Negocjuj" i "NTLM" w tej kolejności.

Aplikacja ASP.NET używa EF, a ciąg połączenia jest skonfigurowany do używania zintegrowanych zabezpieczeń ...

<connectionStrings> 
    <add name="MyContext" 
      connectionString="metadata=res://*/Data.MyModel.csdl|res://*/Data.MyModel.ssdl|res://*/Data.MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=sql1.mydomain.local\sql2008r2;Initial Catalog=MyDatabase;Persist Security Info=false;Integrated Security=True;MultipleActiveResultSets=True&quot;" 
      providerName="System.Data.EntityClient" /> 
</connectionStrings> 

My Web config Określa zarówno uwierzytelnianie Windows i personifikacji, bo using stron asynchroniczny, ja mieć również włączoną politykę inpersonation płynącej ...

<runtime> 
    <alwaysFlowImpersonationPolicy enabled="true" /> 
</runtime> 

<system.web> 
    <authentication mode="Windows" /> 
    <identity impersonate="true" /> 
</system.web> 

Gdybym zalogować się lokalnie (na „web1”) i przejdź do aplikacji (za pomocą IE), to wszystko działa - ale to nie wiąże się z podwójną że chmiel Próbuję rozwiązać.

Jeśli loguję się na inną maszynę, a następnie przeglądam aplikację za pomocą IE lub przeglądam komputer lokalny za pomocą FireFox, to nie działa - uwaga: FireFox robi mi zapytanie o szczegóły logowania. Połączenie z bazą danych kończy się niepowodzeniem z komunikatem "Logowanie nie powiodło się dla użytkownika" ZARZĄDZANIE NT \ LOGOWANIE ANONIMOWE \ "

W przeciwieństwie do wielu artykułów (i tutaj może być częścią problemu), nie używam żadnego niestandardowego kodu do podszywania się pod użytkownika użytkownik. Rozumiem, że podszywanie się zostanie zastosowane we wszystkich aplikacjach przez powyższe ustawienia web.config. Wszystko, co robię, to otworzyć połączenie, a następnie zamknąć je ponownie, gdy skończę.

Najwyraźniej brakowało mi kroku (lub dwóch), ale po przejrzeniu całej dokumentacji, którą mogę znaleźć (i było dużo), nadal nie mogę znaleźć tego, co to jest. Nie pomaga to, że 99% dokumentacji, którą mogę znaleźć, jest faktycznie związane z IIS6 i Windows 2003, ale zasady powinny pozostać takie same.

Czy ktoś mógł uzyskać taką konfigurację do pracy w systemie Windows 7 i/lub Windows Server 2008?

+0

Włącz rejestrowanie zdarzeń Kerberos na serwerze WWW i serwerze bazy danych: http://support.microsoft.com/kb/262177?wa=wsignin1.0 Przeglądarka zdarzeń jest kluczem do wyszukiwania i naprawiania błędów Kerberos. – brian

+0

Mam włączone to, a także pobrałem narzędzie Monitor sieci, ale nadal nie widzę wystarczającej ilości informacji, aby powiedzieć mi, co jest nie tak. Chyba nie czytam poprawnie, bo nie mam wątpliwości, że tam jest odpowiedź. –

Odpowiedz

7
+0

Widziałem już kilka z nich, a teraz wypróbowałem porady w innych. Niestety nadal nie mogę tego zmusić do działania. –

+3

Dostawca uwierzytelniania systemu Windows w IIS7 musi być ustawiony na Negotiate: Kerberos, a nie NTLM. Oznacza to, że ustawienie uwierzytelniania w trybie jądra musi być wyłączone. http://blog.reveille.org.uk/2010/01/asp-net-impersonation-delegation/ – Joe

+2

Joe; masz rację - to było "Negotiate: Kerberos", którego nie pokazano w żadnej innej dokumentacji, którą znalazłem - prawdopodobnie dlatego, że AFAIK jest nowy dla IIS7 + i cała dokumentacja dotyczy IIS6. –

6

Kiedy skonfigurować SPN dla SQL Server, mamy stwierdziliśmy, że musimy uwzględnić PORT, na którym SQL Server l istens (1433).

Powinieneś pobrać i użyć narzędzia DelegConfig v2 Briana Bootha, aby pomóc ci ustawić poprawne ustawienia konfiguracji. http://blogs.iis.net/brian-murphy-booth/archive/2009/04/22/delegconfig-v2-beta.aspx

Zasadniczo przytrzyma twoją rękę przez cały proces. Stwierdziliśmy, że narzędzie jest nieocenione.

+0

Pobrałem narzędzie. Chociaż jest bardzo dobry, mówi mi, że konfiguracja jest poprawna, ale kiedy spróbuję uzyskać dostęp do testu w tabeli w bazie danych, otrzymuję komunikat o tym samym logowaniu. –

+1

Moja rada polega na zastąpieniu SQL2008R2 portem 1433. 'setspn -a MSSQLSvc/sql1.mydomain.local: 1433 SqlServer' –

+0

John, miałeś również rację odnośnie SPN; Nazwy SPN zostały nazwane, ale jak tylko je usunąłem i utworzyłem jedną nazwę SPN dla host.fqdn: 1433 to pomogło. –

Powiązane problemy