ASP.NET MVC3 IIS6 Domain-Benutzern den Zugriff auf der Website, aber ein anderer Benutzer Zur Datenbank verbinden

StackOverflow https://stackoverflow.com/questions/4609477

Frage

MVC 3 (wahrscheinlich das gleiche für 1 & 2), Server 2003, IIS 6, .NET 4, SQL Server 2005

Ich habe einen einfachen Admin-app, dass nur 2 oder 3 Personen je einbucht werden, so dass ich mit Formularauthentifizierung nicht stören will, trennt Benutzername / pw und das alles. Ich möchte einfach die Benutzeranmeldung haben mit ihren bestehenden AD Benutzer / pw. Aber ich möchte über eine eigene Konto zu SQL Server verbinden, die bereits die entsprechenden Berechtigungen für die ausgewählte DB hat.

Ich habe dies getan, in klassischen Asp mit dem folgende Szenario

IIS: Enable anonymous Access: checked.  Username/pw dedicated account for the SQL Server DB
Integrated Windows authentication: unchecked
Digest authentication: unchecked
Basic authentication: unchecked
.NET Passport authentication: unchecked

Die klassische asp App akzeptiert ein geposteten HTML-Formular, authentifiziert dann über LDAP

' Establish connection
Set objConnection = Server.CreateObject("ADODB.Connection")

' Connection properties
objConnection.Provider = "ADsDSOOBJECT"
objConnection.Properties("User ID") = strUsername
objConnection.Properties("Password") = strPassword
objConnection.Properties("Encrypt Password") = True

' Open connection
objConnection.open "DS Query", strUsername, strPassword  ' user supplied user/pw

' Query Active Directory
strQuery = "SELECT cn FROM 'LDAP://" & strDomain & "' WHERE objectClass='*' "

Set objCommand = server.CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = strQuery

' Get recordset
Set objRS = objCommand.Execute

' If no record of user found
If objRS.BOF Or objRS.EOF Then

    ' User does not exist
    AuthenticateUser = False

Else

    ' User is authentic
    AuthenticateUser = True

End If

Ich möchte das gleiche Verhalten in .NET, aber ohne das HTML-Formular. Es scheint möglich, dass, wenn der Benutzer besucht eine Steuerung mit einem [autorisieren] Attribut:

[Authorize(Users = @"domain\user1, domain\user2, domain\user3")]

, dass sie aufgefordert werden, sollten ihre AD Benutzer / pw (oder auch nicht mit IE, je nach Zone und Auto-Login-Optionen) eingeben dann authentifiziert werden, noch den dedizierten Benutzer in IIS verwenden, um die DB zu verbinden. Wie kann ich das erreichen?

Ich habe immer davon ausgegangen, Identitätswechsel war der Weg zu gehen, so dass dies in meinem web.config ist:

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

Ich habe versucht, das Hinzufügen dieses, aber keine Hilfe:

  <anonymousIdentification enabled="false"/>
  <authorization>
      <allow users="*"/>
      <deny users="?"/>
  </authorization>

Ich kann für mich alles an der Arbeit, wenn ich die Standardauthentifizierung verwenden, aber das ist nur, weil mein Konto auch Zugriff auf die DB hat. Wenn ein anderer Benutzer, die in dieser Users = Liste ist, aber keinen Zugriff auf die DB versucht haben, sie erhalten:

Cannot open database "Dbname" requested by the login. The login
     

ist fehlgeschlagen.       Fehler bei der Anmeldung für den Benutzer 'Domäne \ user3'.

Offensichtlich Identitätswechsel ist seine Sache hier nicht tun.

So hat dies ein ziemlich typisches Beispiel dafür, wie hinter der Firewall auf Ihrem durchschnittliches Windows-Netzwerk zu authentifizieren. Was ist der beste Ansatz? Ich habe eine benutzerdefinierte betrachtet AuthorizeAttribute Code ähnlich wie LDAP-Authentifizierung in ASP. Net MVC Dies scheint näher an, wie die Dinge in der klassischen asp App gearbeitet, aber aus irgendeinem Grunde dachte ich, dass ich einfach alles der Arbeit mit Einstellungen und configuation allein bekommen.

EDIT1:

Nach einigem Barry Dorrans' Beginning ASP.NET Security letzter Nacht lesen, Es scheint, dass ich den Benutzer des App-Pools ändern kann und dass der Benutzer sein, den die SQL Server DB trifft. Ist das richtig? Oder ist es die Anon Benutzer in den Web-Site-Einstellungen, die die DB treffen?

Versucht, die app-Pool Benutzer zu ändern, aber das Konto ist nicht Teil der Gruppe IIS_WPG. Das ist, erforderlich, nicht wahr?

EDIT2: Mit Basis Auth geprüft, Anon mit bestimmten Benutzern überprüft, erhalte ich die folgende:

User.Identity.Name: DOMAIN\jcurran
User.Identity.IsAuthenticated: True
User.Identity.AuthenticationType: Basic


WindowsIdentity.GetCurrent().AuthenticationType: Kerberos
WindowsIdentity.GetCurrent().Name: DOMAIN\jcurran
WindowsIdentity.GetCurrent().IsAuthenticated: True
WindowsIdentity.GetCurrent().IsAnonymous: False
WindowsIdentity.GetCurrent().IsGuest: False
WindowsIdentity.GetCurrent().IsSystem: False
WindowsIdentity.GetCurrent().ImpersonationLevel.ToString(): Impersonation


Thread.CurrentPrincipal.Identity.Name: DOMAIN\jcurran 

Mit Basis Auth nicht markiert, Anon mit bestimmten Benutzer überprüft, habe ich eine leere Seite angezeigt. Inspizieren mit Fiedler ergibt:

HTTP/1.1 401 Unauthorized
Date: Thu, 06 Jan 2011 18:02:42 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 3.0
Cache-Control: private
Content-Length: 0
War es hilfreich?

Lösung

Angenommen, Sie den SQL-Server mit Windows-Auth, dann die App Pool Identität zu ändern ist der Weg zu gehen.

In web.config Sie Satz impersonate="false" oder ASP.NET benötigen werden versuchen, die Client-Anmeldeinformationen zu verwenden, um die Datenbank zu verbinden, anstatt die App Becken (dh es sieht aus wie Identitätswechsel genau das tut, was Sie danach gefragt zu tun ).

In IIS Sie die integrierte Windows-Authentifizierung aktivieren müssen, und Sie können den anonymen Zugriff deaktivieren, wenn Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top