FBA e SQL Server: Una storia d'amore

Il mio collega ha lavorato su una web part in un ambiente di FBA. Tra le altre cose, la web part estrae alcuni dati da SQL server. Il grande piano per questo progetto impone che un amministratore di database Configura protezione a livello di dati in SQL (al contrario di incorporamento di un ID utente in una query SQL o qualche altro approccio).

Il problema è che SQL server non sa nulla di nostro ambiente FBA così che non puoi fidarti di noi. Abbiamo risolto questo problema da, per la mancanza di una parola migliore, manualmente impersonando un utente di Active Directory in modo che abbiamo potuto collegare a SQL tale che SQL dati livello sicurezza opere.

Anche se FBA è una caratteristica ASP.NET, persone di SharePoint nazione abbiamo insegnato i vari motori di ricerca che se sta eseguendo la query per FBA, deve dire che si desidera sapere come configurare FBA in SharePoint. Non sono riuscito a trovare tutte le informazioni su come attivare un FBA orientata applicazione ASP.NET per comunicare con SQL in modo abbiamo bisogno di trovare.

Nel corso di questa ricerca, abbiamo riletto questo articolo: Rappresentazione di ASP.net

Ulteriori ricerche ci hanno portato a questo articolo codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx

Che ci ha aiutato a scrivere il nostro codice, che ho incluso qui sotto. Non è la roba più elegante, ma ha funzionato. Spero che troverete utile.

Ecco il codice che ha lavorato per noi:

protetti Sub btnSearchCarrier_Click(Object sender, EventArgs e)
 {
 provare
 {
 ImpersonateUser iU = Nuovo ImpersonateUser();
 // TODO: Sostituire le credenziali iU.Impersonate("NomeDominio", "Nome utente", "Password");

//
 CODICE
//

 iU.Undo();
 }
 catture (Exception ex)
 {

 }
 }

// Utilizzando la rappresentazione classe come indicato di seguito.

pubblica classe ImpersonateUser
 {
 [DllImport("advapi32. dll", SetLastError = true)]
 pubblica statico extern bool LogonUser(
 String lpszUsername,
 String lpszDomain,
 String lpszPassword,
 int dwLogonType,
 int dwLogonProvider,
 Rif IntPtr phToken);

 [DllImport("Kernel32. dll", CharSet = Charset)]
 privato extern statico bool CloseHandle(IntPtr handle);

 privato statico IntPtr tokenHandle = Nuovo IntPtr(0);
 privato statico WindowsImpersonationContext impersonatedUser;

 // Se è incorporare questo codice in una DLL, Assicuratevi di chiedere che esso
 // viene eseguito con FullTrust.
 [PermissionSetAttribute(SecurityAction. Demand, Nome = "FullTrust")]
 pubblica Impersonate Sub(String domainName, String userName, password: String)
 {
 provare
 {

 // Utilizzare la funzione LogonUser non gestita per ottenere il token dell'utente
 // l'utente specificato, dominio, e la password.
 const int LOGON32_PROVIDER_DEFAULT = 0;

 // Passando questo parametro determina LogonUser creare un token primario.
 const int LOGON32_LOGON_INTERACTIVE = 2;
 tokenHandle = IntPtr. zero;

 // Passo -1 Chiamare LogonUser per ottenere un handle per un token di accesso.
 bool returnValue = LogonUser(
 userName,
 NomeDominio,
 password,
 LOGON32_LOGON_INTERACTIVE,
 LOGON32_PROVIDER_DEFAULT,
 Ref tokenHandle); // tokenHandle - nuovo token di sicurezza

 Se (false = = returnValue)
 {
 int ret = GetLastWin32Error();
 Console. WriteLine("LogonUser chiamata non riuscita con codice di errore : " +
 RET);
 Throw nuovo System. ComponentModel.Win32Exception(RET);
 }

 // Passo - 2
 WindowsIdentity newId = Nuovo WindowsIdentity(tokenHandle);
 // Passo -3
 impersonatedUser = newId.Impersonate();

 }
 catture (Exception ex)
 {
 Console. WriteLine("Eccezione. " + ex.Messaggio);
 }
 }


 /// <Riassunto>
 /// Rappresentazione di fermate
 /// </Riassunto>
 pubblica void Undo()
 {
 impersonatedUser.Undo();
 // Libera i token.
 Se (tokenHandle != IntPtr. zero)
 CloseHandle(tokenHandle);
 }
 }

</fine>

Iscriviti al mio blog.

Technorati Tags:

Un pensiero su "FBA e SQL Server: Una storia d'amore

  1. David all'inizio
    Mi dispiace per questo distacco domanda indipendente ma io potremmo non capire come inviare un'email da questo blog.
    Hai avuto un precedente post dove offerto un ottimo modo per filtrare una libreria per visualizzare i dati senza tag. Avete qualche idea su come si potrebbe visualizzare un elenco di documenti senza tag in una libreria di intero documento? Utilizza un campo vuoto in ricerca avanzata non restituisce alcun risultato.
    Risposta

Lasciare una risposta

L'indirizzo email non verrà pubblicato. i campi richiesti sono contrassegnati *