Mi colega ha estado trabajando en un elemento web en un entorno de FBA. Entre otras cosas, la parte web tira algunos datos de SQL server. El gran plan para este proyecto dicta que un DBA configura la seguridad a nivel de datos en SQL (en lugar de incrustar un ID de usuario en una consulta SQL o algún otro método).
El problema es que SQL server no sabe nada sobre nuestro entorno de FBA para que no puede confiar en nosotros. Solucionamos este problema por, falta de una palabra mejor, manualmente, haciéndose pasar por un usuario de AD que nos podríamos conectar a SQL que datos SQL nivel seguridad trabajos.
Aunque FBA es una característica ASP.NET, gente de SharePoint Nation hemos enseñado los diferentes buscadores si usted está consultando FBA, debe decir que usted quiere saber cómo configurar FBA en SharePoint. No se pudo encontrar encontrar cualquier información sobre cómo habilitar una FBA orientado a la aplicación ASP.NET para comunicarse con SQL de la manera que necesitábamos.
En el transcurso de esta investigación, podemos volver a leer este artículo: Suplantación de ASP.NET
Más investigación nos llevó a este artículo de codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
Eso nos ayudó a escribir el código, que he incluido a continuación. No es lo más elegante, pero funcionó. Espero que encuentres útil.
Aquí está el código que trabajó para nosotros:
protegido void btnSearchCarrier_Click(remitente del objeto, EventArgs e) { Intente { ImpersonateUser iU = Nuevo ImpersonateUser(); // TODO: Reemplazar las credenciales iU.Impersonate("NombreDeDominio", "UserName", "Contraseña"); // CÓDIGO // iU.Undo(); } capturas (Exception ex) { } } // Utilizar suplantación clase mencionadas anteriormente. público clase ImpersonateUser { [DllImport("advapi32.dll", SetLastError = verdadero)] público estática extern bool LogonUser( Cadena lpszUsername, Cadena lpszDomain, Cadena lpszPassword, int dwLogonType, int dwLogonProvider, Ref PhToken IntPtr); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] privada extern estática bool CloseHandle(Manija de IntPtr); privada estática IntPtr tokenHandle = Nuevo IntPtr(0); privada estática WindowsImpersonationContext impersonatedUser; // Si incorporan este código en un archivo DLL, Asegúrese de es la demanda // funciona con FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Nombre = "FullTrust")] público Suplantar a vacío(cadena de nombre de dominio, String userName, contraseña de la cadena) { Intente { // Utilice la función LogonUser no administrada para conseguir token para el usuario // el usuario especificado, dominio, y la contraseña. Const int LOGON32_PROVIDER_DEFAULT = 0; // Este parámetro causa LogonUser crear un token primario. Const int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr.Zero; // Paso -1 Llamar a LogonUser para obtener un identificador para un token de acceso. bool returnValue = LogonUser( nombre de usuario, nombreDeDominio, contraseña, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, Ref tokenHandle); // tokenHandle - nuevo token de seguridad Si (== false returnValue) { int ret = Marshal.GetLastWin32Error(); Console.WriteLine("LogonUser llamada failed with error code : " + RET); tiro nuevo System.ComponentModel.Win32Exception(RET); } // Paso - 2 WindowsIdentity nuevo ID = Nuevo WindowsIdentity(tokenHandle); // Paso -3 impersonatedUser = newId.Impersonate(); } capturas (Exception ex) { Console.WriteLine("Excepción. " + ex.Mensaje); } } /// <Resumen> /// Suplantación de paradas /// </Resumen> público Deshacer vacío() { impersonatedUser.Undo(); // Los tokens gratis. Si (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</final>