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 (as opposed to embedding a user ID in a SQL query or some other approach).
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, për mungesë të një fjale më të mirë, manually impersonating an AD user so that we could connect to SQL such that SQL data level security works.
Even though FBA is an ASP.NET feature, we SharePoint Nation people have taught the various search engines that if you’re querying for 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.
Në rrjedhën e kërkimeve kjo, ne ri-lexuar ky artikull: ASP.NET imitim
Më shumë hulumtime na çoi në këtë artikull codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
Kjo na ndihmoi shkruani kodin tonë, which I’ve included below. It’s not the most elegant stuff, por ai ka punuar. I hope you find it helpful.
Këtu është kodi që ka punuar për ne:
mbrojtur void btnSearchCarrier_Click(dërguesi objekt, E EventArgs) { mundohem { U = ImpersonateUser i ri ImpersonateUser(); // TË GJITHA: Replace kredencialet ("DomainName", "UserName", "Password"); // KODI I // iU.Undo(); } kap (Ex Përjashtim) { } } // Përdorimi imitim klasë siç u përmend më poshtë. publik klasë ImpersonateUser { [DllImport("advapi32.dll", SetLastError = i vërtetë)] publik i pandryshueshëm nga jashtë bool LogonUser( LpszUsername String, String lpszDomain, String lpszPassword, dwLogonType int, int dwLogonProvider, ref IntPtr phToken); [DllImport("kernel32.dll", Charset = CharSet.Auto)] privat nga jashtë i pandryshueshëm bool CloseHandle(Trajtojë IntPtr); privat i pandryshueshëm IntPtr tokenHandle = i ri IntPtr(0); privat i pandryshueshëm WindowsImpersonationContext impersonatedUser; // Nëse ju përfshijnë këtë kod në një DLL, të jetë i sigurt për të kërkuar që ajo // shkon me FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")] publik pavlefshme të bëhem(string DomainName, userName string, string fjalëkalimi) { mundohem { // Përdorni funksionin e pakontrolluar LogonUser për të marrë shenjë përdoruesit për // përdorues specifikuar, sferë, pseudonimi dhe fjalëkalimi. const int = LOGON32_PROVIDER_DEFAULT 0; // Kalimi këtë parametër shkakton LogonUser për të krijuar një shenjë primare. const int = LOGON32_LOGON_INTERACTIVE 2; tokenHandle = IntPtr.Zero; // Hap -1 Telefononi LogonUser për të marrë një trajtuar në një shenjë të qasjes. bool = returnValue LogonUser( userName, domain name, fjalëkalim, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, Pronës tokenHandle); // tokenHandle - re të sigurisë token nëse (== false returnValue) { int ret = Marshal.GetLastWin32Error(); Console.WriteLine("LogonUser call failed with error code : " + e drejtë); hedh System.ComponentModel ri.Win32Exception(e drejtë); } // Hap - 2 WindowsIdentity newId = i ri WindowsIdentity(tokenHandle); // Hap -3 impersonatedUser = newId.Impersonate(); } kap (Ex Përjashtim) { Console.WriteLine("Exception occurred. " + ex.Message); } } /// <përmbledhje> /// Stacionet imitim /// </përmbledhje> publik Undo pavlefshme() { impersonatedUser.Undo(); // Lironi argumentet. nëse (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</fund>