2012-12-04 4 views
11

Ich habe eine ASP.NET 4.0-Anwendung, in der ich die Authentifizierung an die Datenbank weiterleiten muss. Für diese Hilfe können Sie den Webserver "app1" und den Datenbankserver "sql1" aufrufen.Kerberos Doppelsprung in ASP.NET 4.0 & SQL2008R2

Der SQL2008R2-Datenbankdienst wird als benannte Instanz "SQL2008R2" unter einem benutzerdefinierten Domänenkonto "SqlServer" ausgeführt. Auf dem Server wird Windows Server 2008 R2 Enterprise Edition ausgeführt. Ich habe einen SPN für diese erstellt ...

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

Die ASP.NET-Anwendung wird unter einem Anwendungspool läuft eine benutzerdefinierte Domänenkonto „WebApplicationUser“ Verwendung in integrierten Pipeline-Modus. Es läuft derzeit auf meinem Laptop mit Windows 7 Enterprise, wird aber eventuell auf Windows Server 2008 R2 Standard Edition gehostet. Ich habe 2 SPN für die Anwendung erstellt (auf der Windows-7-Maschine, die ich zur Zeit aus leite) ...

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

In Active Directory-Benutzer und -Computer, habe ich das „WebApplicationUser“ Konto ausgewählt, und ich habe hat die eingeschränkte Delegierung auf "MSSQLSvc/sql1.mydomain.local: SQL2008R2" unter Verwendung eines beliebigen Protokolls aktiviert (ich habe auch versucht, nur Kerbero zu verwenden).

Die Anwendung wird in IIS 7.5 eingerichtet, und die Authentifizierung wird auf Anonymouse, Basic, Digest und Forms deaktiviert, während "ASP.NET Identitätswechsel" und "Windows" aktiviert werden. Die Windows-Authentifizierung hat "Erweiterter Schutz" deaktiviert und "Kernel-Modus-Authentifizierung" aktiviert. Die Anbieter sind "Negotiate" und "NTLM" in dieser Reihenfolge.

Die ASP.NET-Anwendung verwendet EF, und die Verbindungszeichenfolge so konfiguriert ist, integrierte Sicherheit zu verwenden ...

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

Meine Web-Config spezifiziert sowohl die Windows-Authentifizierung und Identitätswechsel, da ich Seiten einer mit async, I auch aktiviert inpersonation Politik fließen ...

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

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

Wenn ich auf lokal anmelden (auf „web1“) und auf die Anwendung sehen (mit IE), das alles funktioniert - aber dies ist nicht mit dem double-Hop, dass Ich versuche zu lösen.

Wenn ich mich an einem anderen Computer anmelde und dann mit dem IE zur Anwendung blicke oder vom lokalen Rechner mit FireFox blogge, funktioniert das nicht - Hinweis: FireFox fordert mich zur Eingabe der Anmeldedaten auf. Die Verbindung zur Datenbank scheitert mit "Anmeldung fehlgeschlagen für Benutzer 'NT AUTHORITY \ ANONYMOUS LOGON'"

Im Gegensatz zu vielen der Artikel (und hier könnte ein Teil des Problems sein), verwende ich keinen benutzerdefinierten Code zu imitieren der Benutzer. Ich bin davon überzeugt, dass der Identitätswechsel durch die obigen web.config-Einstellungen auf die gesamte Anwendung angewendet wird. Ich öffne nur die Verbindung und schließe sie wieder, wenn ich damit fertig bin.

Ich habe offensichtlich einen Schritt (oder zwei) verpasst, aber nach der ganzen Dokumentation, die ich finden kann (und es gab eine Menge), kann ich immer noch nicht finden, was dieser Schritt ist. Es hilft nicht, dass 99% der Dokumentation, die ich finden kann, tatsächlich mit IIS6 und Windows 2003 verwandt ist, aber die Prinzipien sollten gleich bleiben.

Hat es jemand geschafft, eine solche Konfiguration unter Windows 7 und/oder Windows Server 2008 zu installieren?

+0

Kerberos-Ereignisprotokollierung im Web- und Datenbankserver aktivieren: http://support.microsoft.com/kb/262177?wa=wsignin1.0 Die Ereignisanzeige ist der Schlüssel zum Suchen und Beheben von Kerberos-Fehlern. – brian

+0

Ich habe dies aktiviert, und auch das Netzwerkmonitor-Tool heruntergeladen, aber ich kann immer noch nicht genug Informationen sehen, um mir zu sagen, was falsch ist. Ich denke, ich lese etwas nicht richtig, da ich keinen Zweifel habe, dass die Antwort darin ist. –

Antwort

7
+0

Ich habe schon ein paar davon gesehen, und habe jetzt den Rat in den anderen ausprobiert. Leider kann ich das immer noch nicht zur Arbeit bringen. –

+3

Der Windows-Authentifizierungsprovider in IIS7 muss auf Aushandeln gesetzt sein: Kerberos, nicht NTLM. Dies bedeutet, dass die Kernelmodus-Authentifizierungseinstellung deaktiviert sein muss. http://blog.reveille.org.uk/2010/01/asp-net-impersonation-delegation/ – Joe

+2

Joe; Sie haben recht - es war das "Negotiate: Kerberos", das in keiner der anderen Dokumentation, die ich gefunden habe, gezeigt wurde - wahrscheinlich, weil AFAIK, das neu für IIS7 + ist und die gesamte Dokumentation für IIS6 ist. –

6

Wenn Sie die SPN für SQL Server konfigurieren, haben wir festgestellt, dass wir den PORT mit einschließen müssen, auf dem SQL Server l istens (1433).

Sie sollten das DelegConfig v2-Tool von Brian Booth herunterladen und verwenden, um Ihnen beim Einrichten der richtigen Konfigurationseinstellungen zu helfen. http://blogs.iis.net/brian-murphy-booth/archive/2009/04/22/delegconfig-v2-beta.aspx

Es wird grundsätzlich Ihre Hand den ganzen Weg durch den Prozess halten. Wir haben festgestellt, dass das Tool von unschätzbarem Wert ist.

+0

Ich habe das Tool heruntergeladen. Obwohl es sehr gut ist, sagt es mir, dass die Konfiguration korrekt ist, aber wenn ich dann einen Testzugriff auf eine Tabelle innerhalb der Datenbank versuche, bekomme ich die gleiche Meldung fehlgeschlagen. –

+1

Mein Rat ist, SQL2008R2 durch den Port 1433 zu ersetzen. 'setspn -a MSSQLSvc/sql1.mydomain.local: 1433 SqlServer' –

+0

John, Sie hatten auch über den SPN korrekt; Ich hatte Instanz-SPNs benannt, aber sobald ich sie löschte und einen einzelnen SPN für host.fqdn: 1433 erstellte, half das. –