My colleague has been working on a web part in an FBA environment. Among other things, the web part pulls some data from SQL server. The grand plan for this project dictates that a DBA configures data level security in SQL (in teenstelling met die inbedding van 'n gebruiker-ID in 'n SQL-navraag of 'n ander benadering).
The problem is that SQL server doesn’t know anything about our FBA environment so it can’t trust us. We solved this problem by, vir 'n gebrek van 'n beter woord, manually impersonating an AD user so that we could connect to SQL such that SQL data level security works.
Selfs al FBA is 'n ASP.NET-funksie, ons die SharePoint Nasie mense geleer het om die verskillende soekenjins dat as jy bevraagteken vir FBA, you must mean you want know how to configure FBA in SharePoint. I failed to find find any information on how to enable an FBA oriented ASP.NET application to communicate with SQL in the way we needed.
In die loop van die ondersoek, ons weer lees hierdie artikel: ASP.NET imiteren
Meer navorsing gelei het tot hierdie codproject artikel: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
Wat gehelp het om ons skryf ons kode, which I’ve included below. It’s not the most elegant stuff, maar dit het gewerk. I hope you find it helpful.
Hier is die kode wat vir ons gewerk het:
beskerm nietig btnSearchCarrier_Click(voorwerp sender, EventArgs e) { probeer { ImpersonateUser IE = nuwe ImpersonateUser(); // ALLE: Plaas geloofsbriewe ("Domain Name", "Gebruikersnaam", "Password"); // KODE // iU.Undo(); } vang (Uitsondering ex) { } } // Die gebruik van imiteren klas soos hieronder vermeld. openbare klas ImpersonateUser { [DllImport("Advapi32.dll", SetLastError = waar)] openbare statiese eksterne Bool LogonUser( String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("Kernel32.dll", Charset = CharSet.Auto)] private eksterne statiese Bool Close Handle(IntPtr hanteer); private statiese IntPtr tokenHandle = nuwe IntPtr(0); private statiese WindowsImpersonationContext impersonatedUser; // As jy hierdie kode insluit in 'n DLL, seker wees om dit te eis dat // lopies met FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Noem = "FullTrust")] openbare nietig voorhou(string domein, string gebruikersnaam, string wagwoord) { probeer { // Gebruik die onbeheerde LogonUser funksie te kry die gebruiker teken vir // die gespesifiseerde gebruiker, domein, en wagwoord. konst int LOGON32_PROVIDER_DEFAULT = 0; // Aparte slaag van hierdie parameter veroorsaak LogonUser 'n primêre teken te skep. konst int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr.Zero; // Stap -1 Bel LogonUser 'n handvatsel te verkry tot 'n toegang teken. die Bool returnValue = LogonUser( gebruikersnaam, Domeinnaam, wagwoord, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle); // tokenHandle - nuwe sekuriteit gebrand indien (valse == returnValue) { int ret = Marshal.GetLastWin32Error(); Console.WriteLine("LogonUser oproep misluk met foutkode : " + reg); gooi nuwe System.ComponentModel.Win32Exception(reg); } // Stap - 2 WindowsIdentity newId = nuwe WindowsIdentity(tokenHandle); // Stap -3 impersonatedUser = newId.Impersonate(); } vang (Uitsondering ex) { Console.WriteLine(Msgstr "Uitsondering het voorgekom. " + ex.Message); } } /// <opsomming> /// Tops nabootsing /// </opsomming> openbare nietig Undo() { impersonatedUser.Undo(); // Vry om die tekens. indien (tokenHandle != IntPtr.Zero) Close Handle(tokenHandle); } }
</einde>