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 (en oposición a incorporación dun ID de usuario nunha consulta SQL ou algunha outra visión).
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, por falta dunha palabra mellor, manually impersonating an AD user so that we could connect to SQL such that SQL data level security works.
Aínda FBA é unha característica ASP.NET, nós SharePoint Nación persoas teñen ensinado os distintos buscadores que se está consultando a 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.
No curso de investigar este, que re-ler este artigo: ASP.NET representación
Máis investigación nos levou a este artigo codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
Iso nos axudou a escribir o noso código, which I’ve included below. It’s not the most elegant stuff, but it worked. I hope you find it helpful.
Aquí está o código que funcionou para nós:
protexido baleiro btnSearchCarrier_Click(object sender, EventArgs e) { intentar { U = ImpersonateUser novo ImpersonateUser(); // ALL: Substitúe as credenciais ("DomainName", "UserName", "Password"); // CODE // iU.Undo(); } incorporarse (Exception ex) { } } // A través da representación de clase, como mencionado continuación. público clase ImpersonateUser { [DllImport("advapi32.dll", SetLastError = certo)] público estático externamente bool LogonUser( LpszUsername cadea, Cordas lpszDomain, Cordas lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("kernel32.dll", Charset = CharSet.Auto)] privado externamente estático bool CloseHandle(IntPtr); privado estático IntPtr tokenHandle = novo IntPtr(0); privado estático WindowsImpersonationContext impersonatedUser; // Se incorporar este código nunha DLL, asegúrese de esixir que // carreiras con FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")] público anular Representar(corda Nome_Domínio, cadea usuario, cadea contrasinal) { intentar { // Utilice a función LogonUser xestionado para o token de usuario para // o usuario especificado, dominio, e contrasinal. const int LOGON32_PROVIDER_DEFAULT = 0; // Pasando este parámetro fai que LogonUser para crear un token primario. const int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr.Zero; // Paso -1 Chama LogonUser para obter un identificador para un token de acceso. bool returnValue = LogonUser( Nome de usuario, nome de dominio, contrasinal, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, Propiedade tokenHandle); // tokenHandle - novo token de seguridade se (teito == returnValue) { int ret = Marshal.GetLastWin32Error(); Console.WriteLine("LogonUser call failed with error code : " + dereito); xogar novo System.ComponentModel.Win32Exception(dereito); } // Paso - 2 WindowsIdentity NewID = novo WindowsIdentity(tokenHandle); // Paso -3 impersonatedUser = newId.Impersonate(); } incorporarse (Exception ex) { Console.WriteLine("Exception occurred. " + ex.Message); } } /// <resumo> /// Deixa representación /// </resumo> público anular Desfacer() { impersonatedUser.Undo(); // Liberar os tokens. se (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</final>