El meu col lega ha estat treballant en un element web a un entorn FBA. Entre altres coses, l'element web tira algunes dades de servidor SQL. El gran pla per a aquest projecte dicta que un DBA configura la seguretat de nivell de dades en SQL (en lloc d'incrustar un Windows Live ID en una consulta SQL o algun altre enfocament).
El problema és que servidor SQL no es sap alguna cosa sobre el nostre entorn FBA així que no puc confiar en nosaltres. Hem resolt aquest problema per, per falta d'una paraula millor, un usuari d'AD manualment infiltrat per tal que es podria connectar a SQL tal que obres de seguretat de nivell de dades SQL.
Encara que FBA és una característica de l'ASP.NET, persones SharePoint Nation ens han ensenyat els diversos motors de cerca que si tu estàs consultant per FBA, vostè ha de significar que volen saber com configurar FBA en SharePoint. No vaig poder trobar trobar qualsevol informació sobre com habilitar un FBA orientat a l'aplicació de l'ASP.NET comunicar-se amb SQL de la manera que necessitàvem.
En el curs d'investigar això, vam tornar a llegir aquest article: Suplantació d'identitat de l'ASP.NET
Més recerca ens va portar a aquest article de codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
Que va ajudar a nosaltres escriure el nostre codi, que he inclòs per sota. No és la matèria més elegant, però funcionava. Espero que li resulta útil.
Aquí és el codi que treballava per a nosaltres:
protegit btnSearchCarrier_Click de buit(emissor objecte, EventArgs e) { Provi { ImpersonateUser iU = nou ImpersonateUser(); // TODO: Substituir les credencials iU.Impersonate("NombreDeDominio", "Usuari", "Contrasenya"); // CODI // iU.Undo(); } trampa (Excepció ex) { } } // Utilitzant classe de suplantació d'identitat com esmentades sota. públic classe ImpersonateUser { [DllImport("advapi32.dll", SetLastError = True)] públic estàtica extern bool LogonUser( Corda lpszUsername, Corda lpszDomain, Corda lpszPassword, Int dwLogonType, Int dwLogonProvider, Ref IntPtr phToken); [DllImport("kernel32", CharSet = CharSet.Auto)] privat extern estàtica bool CloseHandle(Nansa de IntPtr); privat estàtica IntPtr tokenHandle = nou IntPtr(0); privat estàtica WindowsImpersonationContext impersonatedUser; // Si vostè incorporar aquest codi en un fitxer DLL, Assegureu-vos que la demanda // funciona amb FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Nom = "FullTrust")] públic Impersonate de buit(corda nombreDeDominio, nom d'usuari de corda, contrasenya de corda) { Provi { // Utilitzeu la funció LogonUser no administrat per aconseguir fitxa per l'usuari // l'usuari especificat, domini, i la contrasenya. Const Int LOGON32_PROVIDER_DEFAULT = 0; // Passant aquest paràmetre provoca LogonUser crear una fitxa primària. Const Int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr.Zero; // Pas -1 Trucar a LogonUser per obtenir una maneta a un testimoni d'accés. bool returnValue = LogonUser( nom d'usuari, nombreDeDominio, contrasenya, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, Ref tokenHandle); // tokenHandle - nou testimoni de seguretat Si (fals = = returnValue) { Int ret = Marshal.GetLastWin32Error(); Console.WriteLine("Crida LogonUser fallava amb el codi d'error : " + ret); tir System.ComponentModel nou.Win32Exception(ret); } // Pas - 2 WindowsIdentity newId = nou WindowsIdentity(tokenHandle); // Pas -3 impersonatedUser = newId.Impersonate(); } trampa (Excepció ex) { Console.WriteLine("Excepció ocorria. " + ex.Missatge); } } /// <resum> /// Parades suplantació d'identitat /// </resum> públic Desfés buit() { impersonatedUser.Undo(); // Lliure de les fitxes. Si (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</final>