Die FBA en SQL Server: 'N 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 (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>

Skryf in op my blog.

Technorati Tags:

Een gedagte oor “Die FBA en SQL Server: 'N Love Story

  1. David vroeg
    Jammer vir die opstel van hierdie onverwante vraag, maar ek kon nie uitvind hoe om jou stuur 'n e-pos van hierdie blog.
    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.
    Antwoord

Laat 'n antwoord

Jou e-posadres sal nie gepubliseer word nie. Verpligte velde gemerk *