Mijn collega heeft gewerkt aan een webonderdeel in een FBA omgeving. Onder andere, het webonderdeel ophaalt sommige gegevens uit SQL server. Het grote plan voor dit project dicteert dat een DBA gegevensbeveiliging in SQL configureert (in tegenstelling tot een gebruikers-ID insluiten in een SQL-query of sommige andere aanpak).
Het probleem is dat SQL server niet niets over ons milieu FBA weet zodat het niet ons vertrouwen. We hebben dit probleem opgelost, bij gebrek aan een beter woord, handmatig imiteert een AD gebruiker zodat we met SQL verbinden kunnen zodanig dat SQL gegevens niveau beveiliging werken.
Hoewel FBA een ASP is.NETTO functie, Wij mensen SharePoint natie hebben geleerd de verschillende zoekmachines die als u voor FBA opvragen bent, u moet betekenen dat u wilt weten hoe u FBA configureert in SharePoint. Ik kan niet vinden zoeken geen informatie over het inschakelen van een FBA georiënteerde ASP.NET-toepassing om te communiceren met SQL in de manier waarop we nodig hadden.
In de loop van dit onderzoek, We lezen in dit artikel: ASP.NET-imitatie
Meer onderzoek leidde ons naar dit artikel codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
Welk sociaal assistente ons onze code schrijven, die ik hieronder heb opgenomen. Het is niet het meest elegante spul, maar het werkte. Ik hoop dat u het nuttig vinden.
Hier is de code die voor ons werkte:
beschermd nietig btnSearchCarrier_Click(object afzender, EventArgs e) { Probeer { ImpersonateUser iU = Nieuw ImpersonateUser(); // TODO: Referenties iU.Impersonate vervangen("Domeinnaam", "Gebruikersnaam", "Wachtwoord"); // CODE // iU.Undo(); } vangst (Uitzondering ex) { } } // Met behulp van imitatie klasse zoals hieronder vermelde. openbare klasse ImpersonateUser { [DllImport("advapi32.dll", SetLastError = True)] openbare statische extern BOOL LogonUser( String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, Ref IntPtr phToken); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] privé extern statische BOOL CloseHandle(IntPtr handgreep); privé statische IntPtr tokenHandle = Nieuw IntPtr(0); privé statische WindowsImpersonationContext impersonatedUser; // Als u deze code in een dll-bestand opnemen, Zorg om te eisen dat het // wordt uitgevoerd met FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Naam = "FullTrust")] openbare VOID Impersonate(tekenreeks domeinnaam, tekenreeks gebruikersnaam, tekenreeks wachtwoord) { Probeer { // Gebruik de onbeheerde LogonUser functie om de gebruiker voor token // de opgegeven gebruiker, domein, en wachtwoord. Const int LOGON32_PROVIDER_DEFAULT = 0; // Deze parameter doorgeven veroorzaakt LogonUser maken een primaire token. Const int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr.Zero; // Stap -1 Bel LogonUser te verkrijgen van een ingang naar een toegangstoken. BOOL returnValue = LogonUser( Gebruikersnaam, Domeinnaam, wachtwoord, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, Ref tokenHandle); // tokenHandle - nieuwe beveiligingstoken Als (== False returnValue) { int ret = Marshal.GetLastWin32Error(); Console.WriteLine("LogonUser call failed with error code : " + RET); gooien nieuwe System.ComponentModel.Win32Exception(RET); } // Stap - 2 WindowsIdentity newId = Nieuw WindowsIdentity(tokenHandle); // Stap -3 impersonatedUser = newId.Impersonate(); } vangst (Uitzondering ex) { Console.WriteLine("Uitzondering is opgetreden. " + ex.Bericht); } } /// <Samenvatting> /// Stopt imitatie /// </Samenvatting> openbare VOID ongedaan maken() { impersonatedUser.Undo(); // Gratis de tokens. Als (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</einde>