FBA ಮತ್ತು SQL ಸರ್ವರ್: ಎ ಲವ್ ಸ್ಟೋರಿ

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 (ಒಂದು SQL ಪ್ರಶ್ನೆಯಲ್ಲಿ ಒಂದು ಬಳಕೆದಾರ ID ಅಥವಾ ಕೆಲವು ಇತರ ಮಾರ್ಗವನ್ನು ಎಂಬೆಡ್ ವಿರುದ್ಧವಾಗಿ).

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, ಒಂದು ಉತ್ತಮ ಪದ ಇಲ್ಲದಿರುವುದು, 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.

In the course of researching this, we re-read this article: ASP.NET Impersonation

More research led us to this codproject article: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx

That helped us write our code, which I’ve included below. It’s not the most elegant stuff, ಆದರೆ ಇದು ಕೆಲಸ. I hope you find it helpful.

ಇಲ್ಲಿ ನಮಗೆ ಕೆಲಸ ಕೋಡ್ ಇಲ್ಲಿದೆ:

ರಕ್ಷಣೆ void btnSearchCarrier_Click(object sender, EventArgs e)
 {
 ಪ್ರಯತ್ನಿಸಿ
 {
 ImpersonateUser iU = ಹೊಸ ImpersonateUser();
 // TODO: Replace credentials
 iU.Impersonate("DomainName", "UserName", "Password");

//
 CODE
//

 iU.Undo();
 }
 ಹಿಡಿ (ಎಕ್ಸೆಪ್ಶನ್ ಮಾಜಿ)
 {

 }
 }

// Using Impersonation class as mentioned below.

ಸಾರ್ವಜನಿಕ ವರ್ಗ ImpersonateUser
 {
 [DllImport("advapi32.dll", SetLastError = ನಿಜವಾದ)]
 ಸಾರ್ವಜನಿಕ ಸ್ಥಿರ extern bool LogonUser(
 String lpszUsername,
 String lpszDomain,
 String lpszPassword,
 int dwLogonType,
 int dwLogonProvider,
 ref IntPtr phToken);

 [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
 ಖಾಸಗಿ extern ಸ್ಥಿರ bool CloseHandle(IntPtr handle);

 ಖಾಸಗಿ ಸ್ಥಿರ IntPtr tokenHandle = ಹೊಸ IntPtr(0);
 ಖಾಸಗಿ ಸ್ಥಿರ WindowsImpersonationContext impersonatedUser;

 // If you incorporate this code into a DLL, be sure to demand that it
 // runs with FullTrust.
 [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
 ಸಾರ್ವಜನಿಕ void Impersonate(string domainName, string userName, string password)
 {
 ಪ್ರಯತ್ನಿಸಿ
 {

 // Use the unmanaged LogonUser function to get the user token for
 // the specified user, domain, ಮತ್ತು ಪಾಸ್ವರ್ಡ್.
 const ಇಂಟ್ LOGON32_PROVIDER_DEFAULT = 0;

 // ಈ ನಿಯತಾಂಕ ಹಾದುಹೋಗುವ LogonUser ಪ್ರಾಥಮಿಕ ಟೋಕನ್ ರಚಿಸಲು ಕಾರಣವಾಗುತ್ತದೆ.
 const ಇಂಟ್ LOGON32_LOGON_INTERACTIVE = 2;
 tokenHandle = IntPtr.Zero;

 // ಹೆಜ್ಜೆ -1 ಪ್ರವೇಶ ಟೋಕನ್ ಒಂದು ಹ್ಯಾಂಡಲ್ ಪಡೆಯಲು LogonUser ಕಾಲ್.
 bool returnValue = LogonUser(
 userName,
 ಡೊಮೇನ್ ಹೆಸರು,
 ಪಾಸ್ವರ್ಡ್,
 LOGON32_LOGON_INTERACTIVE,
 LOGON32_PROVIDER_DEFAULT,
 ಆಸ್ತಿ tokenHandle); // tokenHandle - ಹೊಸ ಭದ್ರತಾ ಟೋಕನ್

 ವೇಳೆ (ಸುಳ್ಳು == returnValue)
 {
 ಇಂಟ್ ನಿವೃತ್ತ = Marshal.GetLastWin32Error();
 Console.WriteLine("LogonUser call failed with error code : " +
 ಬಲ);
 ಎಸೆ ಹೊಸ System.ComponentModel.Win32Exception(ಬಲ);
 }

 // ಹೆಜ್ಜೆ - 2
 WindowsIdentity = newId ಹೊಸ WindowsIdentity(tokenHandle);
 // ಹೆಜ್ಜೆ -3
 impersonatedUser = newId.Impersonate();

 }
 ಹಿಡಿ (ಎಕ್ಸೆಪ್ಶನ್ ಮಾಜಿ)
 {
 Console.WriteLine("Exception occurred. " + ex.Message);
 }
 }


 /// <ಸಂಗ್ರಹವಾದ>
 /// ನಟನೆಯ ನಿಲ್ದಾಣಗಳು
 /// </ಸಂಗ್ರಹವಾದ>
 ಸಾರ್ವಜನಿಕ ರದ್ದುಮಾಡು ಶೂನ್ಯವಾಗುವ()
 {
 impersonatedUser.Undo();
 // ಸಂಕೇತಗಳನ್ನು ಫ್ರೀ.
 ವೇಳೆ (tokenHandle != IntPtr.Zero)
 CloseHandle(tokenHandle);
 }
 }

</ಕೊನೆಯಲ್ಲಿ>

ನನ್ನ ಬ್ಲಾಗ್ ಚಂದಾದಾರರಾಗಿ.

ನನ್ನ ಟ್ಯಾಗ್ಗಳು:

ಒನ್ ಆನ್ ಭಾವಿಸಲಾಗಿದೆ "FBA ಮತ್ತು SQL ಸರ್ವರ್: ಎ ಲವ್ ಸ್ಟೋರಿ

  1. ಡೇವಿಡ್ ಆರಂಭಿಕ
    Sorry for posting this unrelated question but I could not figure out how to send you an email from this 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.

ಒಂದು ಉತ್ತರಿಸಿ ಬಿಡಿ

ನಿಮ್ಮ ಈಮೇಲ್ ವಿಳಾಸ ರ ಆಗುವುದಿಲ್ಲ. ಅಗತ್ಯವಿರುವ ಜಾಗ ಗುರುತಿಸಲಾಗಿದೆ *