FBA і SQL Server: 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 (у адрозненне ад укладання ідэнтыфікатар карыстальніка ў запытах SQL або іншы падыход).

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.

Хоць FBA гэта функцыя ASP.NET, мы, людзі, нацыя SharePoint навучылі ў розных пошукавых сістэмах, што калі вы запыце 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.

У ходзе даследавання гэтага, Мы яшчэ раз прачытаць гэты артыкул: Увасабленне ASP.NET

Дадатковыя даследаванні прывялі нас да гэтай артыкуле codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx

, Якія дапамаглі нам напісаць наш код, which I’ve included below. It’s not the most elegant stuff, але ён працаваў. I hope you find it helpful.

Вось код, які працаваў на нас:

абаронены пустата btnSearchCarrier_Click(Аб'ект адпраўніка, EventArgs электроннай)
 {
 старацца
 {
 U = ImpersonateUser новы ImpersonateUser();
 // УСЕ: Замяніць паўнамоцтвы
 ("DomainName", "UserName", "Password");

//
 КОД
//

 iU.Undo();
 }
 злавіць (Выключэнне былых)
 {

 }
 }

// Выкарыстанне увасабленне класа, як паказана ніжэй.

грамадскасць клас ImpersonateUser
 {
 [DllImport("advapi32.dll", SetLastError = праўда)]
 грамадскасць статычны знешне bool LogonUser(
 Струнны lpszUsername,
 Струнны lpszDomain,
 Струнны lpszPassword,
 дзесятковага dwLogonType,
 дзесятковага dwLogonProvider,
 спасылка IntPtr phToken);

 [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
 прыватны знешне статычны BOOL CloseHandle(IntPtr ручкай);

 прыватны статычны IntPtr tokenHandle = новы IntPtr(0);
 прыватны статычны WindowsImpersonationContext impersonatedUser;

 // Калі вы ўключаеце гэты код у DLL, не забудзьцеся запатрабаваць, каб яны
 // Працуе FullTrust.
 [PermissionSetAttribute(SecurityAction.Demand, NAME = "FullTrust")]
 грамадскасць анулявання Impersonate(Радок ИмяДомена, Радок имя_пользователя, Радок пароля)
 {
 старацца
 {

 // Выкарыстоўвайце некіравальны LogonUser функцыю, каб атрымаць маркер для карыстальнікаў
 // Указаны карыстальнік, дамен, і пароль.
 будаўніцтва дзесятковага LOGON32_PROVIDER_DEFAULT = 0;

 // Праходзячы гэты параметр выклікае LogonUser для стварэння асноўнай маркер.
 будаўніцтва дзесятковага LOGON32_LOGON_INTERACTIVE = 2;
 tokenHandle = IntPtr.Zero;

 // Крок -1 Патэлефануйце LogonUser каб атрымаць дэскрыптар маркер доступу.
 BOOL ReturnValue = LogonUser(
 имя_пользователя,
 Даменнае імя,
 пароль,
 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);
 }
 }

</канец>

Падпісацца на мой блог.

Technorati Тэгі:

Адна думка пра «FBA і SQL Server: Love Story

  1. Дэвід Раннія
    Выбачайце за размяшчэнне гэтага не звязаных пытання, але я не мог зразумець, як адправіць Вам па электроннай пошце з гэтага блога.
    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.

Пакінуць каментар

Ваш электронны адрас не будзе апублікаваны. Абавязковыя палі пазначаныя * *