FBA og 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 (öfugt við embedding kenni í SQL fyrirspurn eða einhver önnur nálgun).

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, fyrir skort á betri orð, manually impersonating an AD user so that we could connect to SQL such that SQL data level security works.

Jafnvel þó FBA er ASP.NET lögun, við SharePoint Nation fólk hefur kennt á ýmsum leitarvélum að ef þú ert fyrirspurn um 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.

Í tengslum við rannsókn þessa, við aftur að lesa þessa grein: ASP.NET Impersonation

Fleiri rannsóknir leitt okkur til þessa codproject grein: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx

Það hjálpaði okkur að skrifa kóðann okkar, which I’ve included below. It’s not the most elegant stuff, but it worked. I hope you find it helpful.

Hér er kóðinn sem starfaði fyrir okkur:

vernda ógilt btnSearchCarrier_Click(mótmæla sendanda, EventArgs e)
 {
 reyna
 {
 ImpersonateUser ae = ImpersonateUser();
 // TODO: Skipta persónuskilríki
 ("DomainName", "UserName", "Password");

//
 CODE
//

 iU.Undo();
 }
 veiða (Undantekning fyrrverandi)
 {

 }
 }

// Using Impersonation bekknum eins og getið hér að neðan.

almennings flokki ImpersonateUser
 {
 [DllImport("advapi32.dll", SetLastError = satt)]
 almennings truflanir Ytri bool LogonUser(
 String lpszUsername,
 String lpszDomain,
 String lpszPassword,
 int dwLogonType,
 int dwLogonProvider,
 tilv IntPtr phToken);

 [DllImport("kernel32.dll", Msgstr = CharSet.Auto)]
 einkaaðila Ytri truflanir bool CloseHandle(IntPtr höndla);

 einkaaðila truflanir IntPtr tokenHandle = IntPtr(0);
 einkaaðila truflanir WindowsImpersonationContext impersonatedUser;

 // Ef þú fella kóðann í DLL, vera viss um að krefjast þess að það
 // keyrir með FullTrust.
 [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
 almennings ógilt túlka(band vistfang, band username, band lykilorð)
 {
 reyna
 {

 // Notaðu óviðráðanlegur LogonUser virka til að fá notanda tákn fyrir
 // sem tilgreind notandi, lén, og lykilorð.
 const int LOGON32_PROVIDER_DEFAULT = 0;

 // Brottför þessa breytu veldur LogonUser að búa til aðal tákn.
 const int LOGON32_LOGON_INTERACTIVE = 2;
 tokenHandle = IntPtr.Zero;

 // Skref -1 Kalla LogonUser að fá handfang til aðgang skapi.
 bool returnValue = LogonUser(
 username,
 vistfang,
 lykilorð,
 LOGON32_LOGON_INTERACTIVE,
 LOGON32_PROVIDER_DEFAULT,
 dómari tokenHandle); // tokenHandle - ný öryggi tákn

 ef (rangar == returnValue)
 {
 int RET = Marshal.GetLastWin32Error();
 Console.WriteLine("LogonUser call failed with error code : " +
 RET);
 kasta Ný System.ComponentModel.Win32Exception(RET);
 }

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

 }
 veiða (Undantekning fyrrverandi)
 {
 Console.WriteLine("Exception occurred. " + ex.Message);
 }
 }


 /// <Yfirlit>
 /// Hættir notendur villi
 /// </Yfirlit>
 almennings ógilt Afturkalla()
 {
 impersonatedUser.Undo();
 // Free tókum.
 ef (tokenHandle != IntPtr.Zero)
 CloseHandle(tokenHandle);
 }
 }

</enda>

Gerast áskrifandi að bloggið mitt.

Technorati Tags:

Ein hugsun um „FBA og SQL Server: A Love Story

  1. David Early
    Því miður fyrir að senda þetta ótengdum spurningu en ég gat ekki fundið út hvernig á að senda þér tölvupóst frá þessu bloggi.
    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.
    Svara

Eftir svar

Netfangið þitt verður ekki birt. Nauðsynlegir reitir eru merktir *