FBA i SQL Server: A Love Story

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 (za razliku ugrađivanje korisnički ID u SQL upitu ili neki drugi pristup).

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, u nedostatku bolje riječi, manually impersonating an AD user so that we could connect to SQL such that SQL data level security works.

Iako FBA je ASP.NET značajka, mi SharePoint Nation ljudi su učili razne tražilice da ako ste upite za 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.

Tijekom istraživanja ove, smo ponovno čitati ovaj članak: ASP.NET Lažno

Više istraživanja dovela nas je do ovoga codproject članak: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx

To su nam pomogli napisati našu kôda, which I’ve included below. It’s not the most elegant stuff, ali to je radio. I hope you find it helpful.

Evo kod koji je radio za nas:

zaštićen void btnSearchCarrier_Click(Objekt pošiljatelj, EventArgs e)
 {
 pokušati
 {
 ImpersonateUser ij = novi ImpersonateUser();
 // SVE: Zamijenite vjerodajnice
 ("DomainName", "UserName", "Password");

//
 KODEKS
//

 iU.Undo();
 }
 ulov (Iznimka ex)
 {

 }
 }

// Korištenje oponašanju klase kao što je spomenuto u nastavku.

javni klasa ImpersonateUser
 {
 [DllImport("advapi32.dll", SetLastError = pravi)]
 javni statički vanjski bool LogonUser(
 Gudački lpszUsername,
 Gudački lpszDomain,
 Gudački lpszPassword,
 int dwLogonType,
 int dwLogonProvider,
 ref IntPtr phToken);

 [DllImport("kernel32.dll", Charset = CharSet.Auto)]
 privatni vanjski statički bool CloseHandle(IntPtr ručka);

 privatni statički IntPtr tokenHandle = novi IntPtr(0);
 privatni statički WindowsImpersonationContext impersonatedUser;

 // Ako inkorporirati ovaj kod u DLL, budite sigurni da zahtijevaju da
 // staze s FullTrust.
 [PermissionSetAttribute(SecurityAction.Demand, Ime = "FullTrust")]
 javni poništiti utjeloviti(Niz DOMAINNAME, Niz userName, Niz lozinka)
 {
 pokušati
 {

 // Koristite neupravljana funkciju LogonUser da biste dobili upute za token za
 // Navedeni korisnik, domena, i lozinka.
 const int LOGON32_PROVIDER_DEFAULT = 0;

 // Prolazeći ovaj parametar uzrokuje LogonUser stvoriti primarnu token.
 const int LOGON32_LOGON_INTERACTIVE = 2;
 tokenHandle = IntPtr.Zero;

 // Korak -1 Pozivni LogonUser dobiti držač za pristupni token.
 bool returnValue = LogonUser(
 userName,
 naziv_domene,
 lozinka,
 LOGON32_LOGON_INTERACTIVE,
 LOGON32_PROVIDER_DEFAULT,
 ref tokenHandle); // tokenHandle - Novi sigurnosni token

 ako (lažno == returnValue)
 {
 int ret = Marshal.GetLastWin32Error();
 Console.WriteLine("LogonUser call failed with error code : " +
 desno);
 baciti Novi System.ComponentModel.Win32Exception(desno);
 }

 // Korak - 2
 WindowsIdentity newId = novi WindowsIdentity(tokenHandle);
 // Korak -3
 impersonatedUser = newId.Impersonate();

 }
 ulov (Iznimka ex)
 {
 Console.WriteLine("Exception occurred. " + ex.Message);
 }
 }


 /// <rezime>
 /// Zaustavlja lažno
 /// </rezime>
 javni poništiti Undo()
 {
 impersonatedUser.Undo();
 // Oslobodite tokena.
 ako (tokenHandle != IntPtr.Zero)
 CloseHandle(tokenHandle);
 }
 }

</kraj>

Pretplatite se na moj blog.

Technorati Tags:

Jedna misao o „FBA i SQL Server: A Love Story

  1. David Rano
    Nažalost za postavljanje ovaj nepovezanih pitanje, ali ja ne mogu shvatiti kako da vam poslati e-mail s ovog bloga.
    You had a previous post where you offered a great way to filter a library to view untagged data. Do you have any thoughts as to how you might view a list of untagged documents in an entire document library? Using an empty field in advanced search does not return any results.

Dopust jedan Odgovor

Vaša email adresa neće biti objavljena. obavezna polja su označena *