2010-01-20 6 views
14

Sto tentando di utilizzare la rappresentazione e la delega in un'app Web ASP.Net della intranet per passare le credenziali degli utenti autenticati su un server SQL.Applicazione Web ASP.Net che tenta di utilizzare la rappresentazione e la delega per connettersi a SQL Server

Il server Web e il server SQL sono due macchine separate, ma nello stesso dominio, quindi è necessaria la delega.

ho fatto la seguente:

  • set <authentication mode="Windows"/> e <identity impersonate="true"/> nel web.config di mia web-app.
  • Abilitato con delega vincolata dal server Web al servizio MSSQLSvc su SQL Server, in Active Directory.
  • abilitato solo l'autenticazione di Windows nel sito Web, tramite IIS.

A quanto pare questo dovrebbe lavorare tutti, ma non (SQL Server sta negando l'accesso all'utente anonimo - "Accesso non riuscito per l'utente 'NT AUTHORITY \ ANONYMOUS accesso'").

In IIS7, il pool di applicazioni è impostato per utilizzare la modalità pipeline integrata ed è in esecuzione con NetworkService Identity. Il sito Web ha solo l'autenticazione di Windows abilitata, la protezione estesa è disattivata, l'autenticazione in modalità Kernel è abilitata e NTLM è il provider.

Tutte le pagine Web che ho letto sembrano indicare che la mia configurazione dovrebbe funzionare. Cosa mi manca?

+0

"SQL Server sta negando l'accesso all'utente anonimo", il tuo utente anonimo ha accesso al database? –

+0

L'utente anonimo non ha accesso al database. Non voglio che l'utente anonimo acceda al database, voglio l'utente corrente del sito. La delega dovrebbe significare che l'utente corrente è quello che accede al database, piuttosto che l'utente anonimo. –

risposta

16

ho scoperto la risposta:

Il provider di autenticazione di Windows in IIS7 deve essere impostata su negoziare: Kerberos, non NTLM. Ciò significa che l'impostazione di autenticazione in modalità Kernel deve essere disabilitata. Questo sembra andare bene. Penso di aver ragione nel dire che l'autenticazione in modalità Kernel è richiesta quando si utilizza un'identità personalizzata, ovvero un'identità specifica. La delega può utilizzare un numero arbitrario di identità. Quindi tutto va bene.

Ho scritto anche un blog post, che va un po 'più in dettaglio.

+0

Il post del blog è stato eccellente, grazie mille :) – Chiramisu

+0

Hai riscontrato problemi con gli utenti che non hanno inoltrato le credenziali al server SQL quando utilizzavano un browser diverso da Internet Explorer? Ho scoperto che una volta che hanno stabilito una sessione in IE, il sito Web può delegare le proprie credenziali se passano a un altro browser. –

-1

No, non è esatto dire che è necessario Kerberos, un SPN, per fidarsi del server per la delega e che questo è l'UNICO modo per farlo. Sì, questo è un modo per farlo (e hai bisogno di tutto per farlo accadere tramite Kerberos), ma non è l'UNICO modo, o anche tecnicamente il modo più sicuro o il modo più semplice. Vuoi veramente fare configurazioni extra e creare un login per ogni utente web sul tuo DB in SQL? Cosa succede se uno di questi account è compromesso? Più account, più vulnerabilità.

No, creare invece un account di servizio Dominio e consentire l'accesso a SQL. Se i tipi di sicurezza bloccano le cose, concedi a quell'utente questi diritti: Accesso come servizio, Accesso come lavoro batch e Consenti accesso in locale. Oppure, se questo è solo per sviluppare e testare la teoria o se non ti interessa o non riesci a trovare le impostazioni o continuerai a ricevere errori in seguito, e questo potrebbe non ottenere un ampio seguito, ma dargli un amministratore locale (a volte tu devi fare quello che devi fare - alcuni professionisti della sicurezza bloccano le cose più da vicino di quanto mi piacerebbe scrivere - possono sempre risolvere i problemi di sicurezza in seguito per bloccarli indietro). Quindi imposta quell'account come account personalizzato nel pool di app e assegna a quell'account un accesso in SQL. Dategli un dbo solo su QUESTO database.

Sul sito Web in IIS, impostare il tipo di autenticazione come Windows. Li ho visti dire "Basic" in altri blog, quindi Kerberos funzionerà, ma NTLM utilizza l'autenticazione di Windows. In IIS 7, è possibile anche abilitare ASP.Rappresentazione NET. Personalmente, ho provato solo su IIS 6, ma il principale è lo stesso.

nel web.config, aggiungere questo sotto <configuration>, che è un "pari" a <system.web>:

<connectionStrings> 
    <add 
    name="NorthwindConnectionString" 
    connectionString="Data Source=serverName;Initial 
    Catalog=Northwind;Integrated Security=SSPI;User 
    ID=userName;Password=password" 
    providerName="System.Data.SqlClient" 
    /> 
</connectionStrings> 

E in <system.web>:

<authentication mode="Windows"/> 
<identity impersonate="true" 
     userName="domain\user" 
     password="password" /> 

quindi leggere la stringa nella vostra app come this:

using System.Configuration; 

string connString = String.Empty; 
if (ConfigurationManager.ConnectionStrings.ConnectionStrings.Count > 0) 
{ 
    connString = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString; 
    if (connString != null) // do DB connection stuff here 
     Console.WriteLine("Northwind connection string = \"{0}\"", 
     connString.ConnectionString); 
    else 
     Console.WriteLine("No Northwind connection string"); 
} 

Vedere http://msdn.microsoft.com/en-us/library/ms178411.aspx.

Se non si connette all'account di servizio dopo aver inserito quell'account in web.config per il tag impersonato e la connessione SQL, è possibile utilizzare i metodi di rappresentazione utilizzando WindowsImpersonationContext (http://msdn.microsoft.com/en-us/library/system.security.principal.windowsimpersonationcontext.aspx). Nello specifico, vuoi wic.Impersonate() e wic.Undo() dopo aver ottenuto il loro token. Puoi leggere il dominio, il nome e la password dell'account di servizio da web.config, sotto forma di AppKeys.

In breve, ci sono modi per risolvere i problemi. È anche possibile crittografare la password nel web.config - sia in ConnectionString, sia se si desidera archiviarla in un AppKey anziché direttamente nel tag "impersonate", se non si desidera che le password in testo semplice siano presenti (Mi raccomando contro), e quindi puoi averlo per la creazione di un token di accesso, se hai bisogno di usare i metodi di rappresentazione (come ho fatto io).

+0

Questo in realtà non risponde alla sua domanda –

+0

@FireLizzard, ho dato tutti i passaggi necessari per "utilizzare la rappresentazione e la delega in un'app web ASP.Net intranet per passare le credenziali degli utenti autenticati su un server SQL". Ciò richiede 1) un account svc, 2) i diritti nel criterio di sicurezza locale (descritto sopra) 3) i diritti in SQL (dbo - descritto sopra), 3) aggiungi l'account all'identità del pool di app, 4) imposta il sito Web in IIS a Windows autenticazione, 5) set conn string in web.config, 6) set tag e identità di autenticazione in web.config, 7) aggiungi la stringa di connessione nel codice, 8) usa il codice di rappresentazione al link MSDN se non funziona. – vapcguy

+0

Gli ambienti diversi avranno diritti diversi, per quanto riguarda i conti, e potrebbe o meno disporre dei privilegi per fornire all'account i diritti di cui ha bisogno. Senza conoscere il suo ambiente, è difficile dare le specifiche di esattamente ciò che funzionerà. Dovrà provare a dare a svc acct i diritti che ho specificato e impostare il sito web e web.config. Forse funzionerà senza il codice di rappresentazione MSDN, forse no. Per la mia implementazione che avevo appena completato quando ho pubblicato questi passaggi, ne avevo bisogno. Per uno che ho fatto recentemente usando Kerberos, SPN e un accc di svc, non l'ho fatto. – vapcguy

Problemi correlati