Mae fy nghyd-Aelod wedi bod yn gweithio ar ran we mewn amgylchedd FBA. Ymhlith pethau eraill, Mae y rhan o'r we yn dwyn rhai data o'r gweinydd SQL. Mae cynllun mawr ar gyfer y prosiect hwn yn mynnu bod Mae'r DBA yn ffurfweddu'r lefel diogelwch data yn SQL (yn hytrach na sefydlu yn ID defnyddiwr mewn ymholiad SQL neu ryw ddull arall).
Y broblem yw nad yw'n gweinydd SQL yn gwybod unrhyw beth am ein hamgylchedd FBA felly ni ellir ei ymddiried ynom. Rydym yn datrys y broblem hon gan, am ddiffyg gair gwell, eich hun hi dynwared defnyddiwr OC fel y gellid cysylltu SQL y mae SQL data lefel gwaith diogelwch.
Hyd yn oed er FBA yn nodwedd ASP.NET, rydym yn SharePoint Nation pobl wedi dysgu y gwahanol beiriannau chwilio, os ydych yn holi am FBA, Rhaid i chi olygu eich bod am wybod sut i ffurfweddu FBA yn SharePoint. Methais ddod o hyd i canfod a oedd unrhyw wybodaeth ar sut i alluogi FBA yn canolbwyntio ar gais ASP.NET i gyfathrebu â SQL yn y ffordd yr oedd angen inni.
Wrth ymchwilio i'r, rydym yn ail-ddarllen yr erthygl hon: ASP.NET dynwared
Ein harwain mwy o ymchwil i'r erthygl hon codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
Mae hynny'n ein helpu i ysgrifennu ein cod, Yr wyf wedi cynnwys isod. Nid yw y pethau mwyaf cain, ond roedd yn gweithio. Gobeithiaf y bydd yn ddefnyddiol yn.
Dyma'r cod sy'n gweithio i ni:
diogelu ddi-rym btnSearchCarrier_Click(anfonwr gwrthrych, EventArgs e) { ceisio { U = ImpersonateUser newydd ImpersonateUser(); // POB: Amnewid cymwysterau ("DomainName", "UserName", "Cyfrinair"); // COD // iU.Undo(); } dal (Ex Eithriad) { } } // Defnyddio dosbarth dynwared fel a grybwyllir isod. cyhoeddus dosbarth ImpersonateUser { [DllImport("advapi32.dll", SetLastError = wir)] cyhoeddus sefydlog allanol bool LogonUser( LpszUsername llinyn, Llinynnol lpszDomain, Llinynnol lpszPassword, dwLogonType int, int dwLogonProvider, cyf IntPtr phToken); [DllImport("kernel32.dll", Charset = CharSet.Auto)] preifat allanol sefydlog Bool CloseHandle(IntPtr trin); preifat sefydlog IntPtr tokenHandle = newydd IntPtr(0); preifat sefydlog WindowsImpersonationContext impersonatedUser; // Os ydych yn cynnwys y cod hwn i mewn i DLL, gofalwch eich bod yn mynnu ei fod yn // rhedeg gyda FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Enwch = "FullTrust")] cyhoeddus dynwared unedau gwag(llinyn enw parth, userName llinyn, cyfrinair llinyn) { ceisio { // Defnyddiwch y swyddogaeth LogonUser heb ei reoli i gael y tocyn defnyddiwr ar gyfer // y defnyddiwr a bennir, parth, a chyfrinair. Etholaeth int LOGON32_PROVIDER_DEFAULT = 0; // Pasio paramedr mae hyn yn achosi LogonUser i greu tocyn gynradd. Etholaeth int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr.Zero; // Cam -1 Ffoniwch LogonUser i gael dolen i tocyn mynediad. Bool returnValue = LogonUser( userName, enw parth, cyfrinair, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, Eiddo tokenHandle); // tokenHandle - diogelwch newydd tocyn os (ffug == returnValue) { int ret = Marshal.GetLastWin32Error(); Console.WriteLine("LogonUser alwad wedi methu gyda'r cod gwall : " + iawn); taflu System.ComponentModel newydd.Win32Exception(iawn); } // Cam - 2 WindowsIdentity Newid = newydd WindowsIdentity(tokenHandle); // Cam -3 impersonatedUser = newId.Impersonate(); } dal (Ex Eithriad) { Console.WriteLine("Digwyddodd eithriad wrth. " + ex.Message); } } /// <crynodeb> /// Arosfannau ffugio /// </crynodeb> cyhoeddus unedau gwag Dadwneud() { impersonatedUser.Undo(); // Rhyddhau'r tocynnau. os (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</diwedd>