ASP.NET MVC3 IIS6 Lasciare che gli utenti di dominio di accedere al sito, ma un altro utente Connessione al database

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

Domanda

MVC 3 (probabilmente lo stesso per 1 & 2), Server 2003, IIS 6, NET 4, SQL Server 2005

Ho una semplice applicazione di amministrazione che solo 2 o 3 persone potrà mai accedere, in modo da non voglio perdere tempo con autenticazione basata su form, nome utente separati / pw e tutto il resto. Voglio avere semplicemente l'accesso utente con il loro utente AD esistente / pw. Ma voglio per connettersi a SQL Server tramite un account dedicato che ha già autorizzazioni appropriate per il DB selezionato.

Ho fatto questo in ASP classico con lo scenario seguente

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

L'asp applicazione classica accetta un form HTML inviato, quindi autentica tramite 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

Voglio che questo stesso comportamento in .NET, ma senza il modulo HTML. Sembra possibile che quando l'utente visita un controller con un attributo [Autorizza]:

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

che dovrebbero essere richiesto di inserire il proprio user AD / pw (o non con IE, a seconda delle opzioni di zona e auto-login) poi essere autenticata, ma utilizzare l'utente dedicato in IIS per la connessione al DB. Come posso realizzare questo?

Ho sempre assunto la rappresentazione è stata la strada da percorrere, quindi questo è nel mio web.config:

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

Ho provato ad aggiungere questo, ma nessun aiuto:

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

I può ottenere tutto il lavoro per me, se io uso l'autenticazione di base, ma questo è solo perché il mio conto ha anche accesso al DB. Se un altro utente che è in quella Utenti = lista, ma non ha accesso ai tentativi DB, ricevono:

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

non riuscita.       Accesso non riuscito per l'utente 'dominio \ user3'.

Ovviamente la rappresentazione non sta facendo la sua cosa qui.

Quindi, questo deve essere un esempio piuttosto tipico di come per autenticare dietro il firewall della rete media di Windows. Qual è l'approccio migliore? Ho considerato un AuthorizeAttribute personalizzato utilizzando codice simile al in ASP. net MVC Questo sembra più vicino a come le cose funzionavano in ASP classico app, ma per qualche ragione ho pensato che ho potuto solo ottenere tutto lavorando con le impostazioni e configuation da solo.

Edit1:

Dopo aver letto alcune Barry Dorrans' Beginning ASP.NET Security ieri sera, sembra che io possa cambiare l'utente della piscina app e avere che essere l'utente che colpisce il Server DB SQL. È giusto? O è Utenti Anon nelle impostazioni del sito web che colpisce il DB?

provato a cambiare l'utente piscina app, ma l'account non fa parte del gruppo IIS_WPG. Che è necessario, giusto?

EDIT2: Con autenticazione di base selezionata, anon controllata con utente specificato, ottengo il seguente:

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 

Con base auth incontrollato, anon controllata con utente specificato, ricevo una pagina vuota. Ispezione con i rendimenti violinista:

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
È stato utile?

Soluzione

Supponendo che si desidera accedere al server SQL con Windows Auth, quindi cambiare l'identità del pool di app è la strada da percorrere.

Nel web.config è necessario impersonate="false" set o ASP.NET cercherà di utilizzare le credenziali del client per la connessione al database invece che del pool di app (ad esempio sembra che la rappresentazione sta facendo esattamente quello che hai chiesto per fare ).

In IIS è necessario attivare integrata di Windows Auth e si può disattivare l'accesso anonimo, se si desidera.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top