FBA dhe 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 (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>

Abonohen në blogun tim.

Technorati Tags:

Një mendonin mbi "FBA dhe SQL Server: A Love Story

  1. David hershëm
    Na vjen keq për të postuar këtë pyetje palidhur, por unë nuk mund të kuptoj se si për të ju dërgoj një email nga ky 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.

Lini një Përgjigju

Adresa juaj e emailit nuk do të publikohet. Fusha e kërkuar janë shënuar *