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 (ի տարբերություն embedding մի Օգտվող ID մի 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 Nation մարդիկ սովորել տարբեր որոնման է, որ եթե դուք querying համար 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 Նմանակում
More հետազոտությունը հանգեցրել մեզ այս 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 ե) { փորձել { ImpersonateUser û = նոր ImpersonateUser(); // TODO: Փոխարինել հավատարմագրերը ("DomainName", "UserName", "Password"); // CODE // iU.Undo(); } բռնել (Բացառություն են նախկին) { } } // Օգտագործելով IMPERSONATION դաս, ինչպես նշված է ստորեւ. հասարակություն դաս 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.Auto)] անձնական extern Ստատիկ bool CloseHandle(IntPtr կարգավորել); անձնական Ստատիկ IntPtr tokenHandle = նոր IntPtr(0); անձնական Ստատիկ WindowsImpersonationContext impersonatedUser; // Եթե դուք այս կոդը պարունակում է մի DLL, Համոզվեք, որ պահանջել, որ այն // աշխատում է FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")] հասարակություն անվավեր մարմնավորելու(լարային DOMAINNAME, լարային Մականուն, լարային եք գաղտնաբառը) { փորձել { // Օգտագործեք Unmanaged LogonUser գործառույթ ստանալ օգտվողին նշան է // նշված օգտվողին, դոմեյն, եւ ծածկագիրը. const int = LOGON32_PROVIDER_DEFAULT 0; // Անցնելով այս պարամետրը առաջացնում LogonUser ստեղծելու հիմնական նշան. const int = LOGON32_LOGON_INTERACTIVE 2; tokenHandle = IntPtr.Zero; // Քայլ -1 Զանգի LogonUser ստանալ բռնակի համար մուտքի նշան. bool returnValue = LogonUser( Մականուն, DOMAINNAME, գաղտնաբառ, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle); // tokenHandle - նոր անվտանգության նշան եթե (կեղծ == returnValue) { int RET = Marshal.GetLastWin32Error(); Console.WriteLine("LogonUser call failed with error code : " + RET); նետում Նոր System.ComponentModel.Win32Exception(RET); } // Քայլ - 2 WindowsIdentity newid = նոր WindowsIdentity(tokenHandle); // Քայլ -3 impersonatedUser = newId.Impersonate(); } բռնել (Բացառություն են նախկին) { Console.WriteLine("Exception occurred. " + ex.Message); } } /// <ամփոփում> /// Դադարում IMPERSONATION /// </ամփոփում> հասարակություն անվավեր Հետադարձել() { impersonatedUser.Undo(); // Ազատել տառերը. եթե (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</վերջ>