Můj kolega pracuje na webové části v prostředí FBA. Mimo jiné, Webová část táhne některá data ze serveru SQL server. Velký plán pro tento projekt diktuje, že DBA nastaví úroveň zabezpečení dat v SQL (na rozdíl od vložení ID uživatele v SQL dotazu, nebo nějaké jiné přístup).
Problém je, že SQL server neví nic o našem FBA prostředí tak to nám nemůže věřit. Jsme vyřešili tento problém, pro nedostatek lepšího slova, ručně zosobnění uživatele AD, tak, že jsme se mohli připojit k SQL tak, aby SQL data na úrovni bezpečnosti práce.
I když FBA je funkce technologie ASP.NET, jsme národ SharePoint lidi učil různé vyhledávače, je-li hledané pro FBA, musí znamenat, že chcete vědět, jak konfigurovat FBA ve službě SharePoint. Jsem se nepodařilo najít najít veškeré informace týkající se povolení FBA orientované prostředí ASP.NET aplikace komunikovat s SQL ve způsobu, jakým jsme potřebovali.
Při zkoumání to, jsme re-četl tento článek: Prostředí ASP.NET zosobnění
Další výzkum nás vedly k tomuto článku codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
To nám pomohl napsat náš kód, což jsem uvedeny níže. Není to elegantní věci, ale fungovalo to. Doufám, že bude užitečné.
Zde je kód, který pracoval pro nás:
chráněná void btnSearchCarrier_Click(objektu odesílatele, EventArgs e) { zkusit { ImpersonateUser iU = nové ImpersonateUser(); // TODO: Nahradit pověření iU.Impersonate("Název domény", "Uživatelské jméno", "Heslo"); // KÓD // iU.Undo(); } Catch (Výjimka ex) { } } // Pomocí zosobnění třídy, jak je uvedeno níže. veřejné Třída ImpersonateUser { [DllImport("advapi32.dll", SetLastError = pravda)] veřejné statický extern bool LogonUser( Řetězec lpszUsername, Řetězec lpszDomain, Řetězec lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] soukromé extern statický bool CloseHandle(IntPtr popisovač); soukromé statický IntPtr tokenHandle = nové IntPtr(0); soukromé statický WindowsImpersonationContext impersonatedUser; // Je-li začlenit tento kód do knihovny DLL, Ujistěte se, že požadovat, aby // spustí s FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Jméno = "FullTrust")] veřejné void zosobnit(název_domény řetězec, řetězec uživatelské jméno, řetězec hesla) { zkusit { // Nespravovaná LogonUser funkci použít k získání tokenu pro uživatele // Zadaný uživatel, doména, a heslo. const int LOGON32_PROVIDER_DEFAULT = 0; // Tento parametr způsobí LogonUser k vytvoření primární token. const int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr.Zero; // Krok -1 Volejte LogonUser získat popisovač token přístupu. bool returnValue = LogonUser( uživatelské jméno, název_domény, heslo, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle); // tokenHandle - nový token zabezpečení Pokud (false == returnValue) { Vrácená hodnota: int = Marshal.GetLastWin32Error(); Console.WriteLine("LogonUser volání se nezdařilo s kódem chyby. : " + ret); hod nové System.ComponentModel.Win32Exception(ret); } // Krok - 2 WindowsIdentity newId = nové WindowsIdentity(tokenHandle); // Krok -3 impersonatedUser = newId.Impersonate(); } Catch (Výjimka ex) { Console.WriteLine("Došlo k výjimce. " + ex.Zpráva); } } /// <Shrnutí> /// Zastaví zosobnění /// </Shrnutí> veřejné void zpět() { impersonatedUser.Undo(); // Zdarma tokeny. Pokud (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</Konec>