10 messaggi dal 23 febbraio 2011
Ambiente:

- Windows 7 64 bit Home Premium
- IIS attivato e correttamente funzionante
- Visual Studio 2010 Ultimate
- SQL Server 2008 R2

Ho scaricato il db AdventureWorks per provare a collegarmi da un banalissimo webform di cui allego il codice:

using System.Data.Oledb;

string ConnString = "Provider=SQLOLEDB;Server=STEFANO-HP\\SQLExpress;Database=AdventureWorksLT;Integrated Security=SSPI";
string SqlString = "SELECT * FROM [SalesLT].[Product]";

OleDbConnection cn = new OleDbConnection(ConnString);
OleDbCommand cmd = new OleDbCommand(SqlString, cn);

System.Data.DataSet ds = new System.Data.DataSet();

OleDbDataAdapter da = new OleDbDataAdapter(cmd);
da.SelectCommand.CommandType = System.Data.CommandType.Text;


da.Fill(ds);

cn.Close();

grd.DataSource = ds;
grd.DataBind();

Il codice funziona perfettamente e riempi una GridView, ma il tutto tramite Cassini. Ora, so perché ho letto diversi post che con IIS è diverso perché mi richiede l'autenticazione. Ho provato a creare un nuovo utente in SQL Server e poi ad aggiungerlo alla cartella sicurezza del db specifico ma non sortisce effetto. L'errore è sempre quello di mancata autorizzazione all'accesso.

Qualcuno mi può spiegare passo passo com'è questa creazione utente da ASP fino a SQL Server passando per la cartella web di IIS ?

Grazie.

ps. aggiungo che ho provato ad aggiunge SERVIZIO DI RETE come utente sia in SQL Server che nelle utenze della cartella applicazione web di IIS ma non funziona lo stesso.
Modificato da StefanoM il 14 dicembre 2011 15.21 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, benvenuto nel forum!

StefanoM ha scritto:

IIS è diverso perché mi richiede l'autenticazione

E' vero che una differenza c'è, ma anche con Cassini (cioè l'Asp.net development server) è richiesta l'autenticazione. Infatti, SQL server è una risorsa a sé stante e necessita di autenticazione per l'accesso ai dati, cosa che non si può bypassare in alcun modo se non fornendo le credenziali di accesso.

Infatti, guarda la tua connection string, contiene questo frammento:
Integrated Security=SSPI
In pratica stai chiedendo a SQL Server di autenticarti con lo stesso utente Windows che sta eseguendo la pagina asp.net.

Se su IIS non funziona è perché esso va in esecuzione con un utente diverso (NT AUTHORITY\SERVIZIO DI RETE, come hai detto anche tu) mentre l'Asp.Net development server va in esecuzione con il tuo utente (NOMEMACCHINA\TUOUSERNAME) che è probabilmente il proprietario del database.

Volendo verificare il nome dell'utente in uso, aggiungi questa linea di codice alla tua pagina:
Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);


Puoi risolvere il problema in due modi:
  • Aggiungendo NT AUTHORITY\SERVIZIO DI RETE agli utenti abilitati all'accesso. Da Sql Server Management Studio espandi il tuo database, poi Sicurezza -> Utenti -> Tasto destro -> Aggiungi utente. Qui puoi anche non concedergli alcun privilegio di proprietà. Fatto questo, fai tasto destro sul database -> Proprietà -> Autorizzazioni e da lì concedi almeno i privilegi di Connessione e Selezione all'utente che hai appena aggiunto.
  • Oppure, se lo reputi opportuno, cambia direttamente il proprietario del database. Tasto destro sul db -> Proprietà -> File -> cambia il proprietario in NT AUTHORITY\SERVIZIO DI RETE


Aggiungo alcune considerazioni:
  • Vedo dalla connection string che stai usando SQL Express. Esso introduce il concetto di "User instance" che semplifica l'accesso al database. In pratica, qualsiasi sia l'utente, gli viene concessa un'istanza tutta sua e isolata dal resto alla quale viene automaticamente aggiunto il database con tutti i privilegi necessari. Provalo, basta creare un db .mdf nella cartella App_Data del sito e modificare la connection string come vedi qui:
    http://msdn.microsoft.com/en-us/library/ms254504.aspx
  • Non utilizzare il client OleDb, per sql server si usa il client System.Data.SqlClient che è necessario, tra l'altro, per sfruttare le "user istances". Qui trovi l'elenco delle classi, in pratica cambia solo il prefisso (da "OleDb" a "Sql"):http://msdn.microsoft.com/it-it/library/system.data.sqlclient%28v=VS.100%29.aspx


ciao
Modificato da BrightSoul il 17 dicembre 2011 11.43 -

Enjoy learning and just keep making
10 messaggi dal 23 febbraio 2011
Grazie, ho risolto successivamente creando un pool specifico per quel db nel quale ho inserito un utente apposito, aggiunto anche internamente all'istanza SQL Server e al db interessato.

Leggerò con attenzione il discorso sull'User Istance.

Grazie ancora :-)

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.