FBA e SQL Server: Unha Historia de Amor

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>

Rexístrate para o meu blog.

Technorati Tags:

Un pensamento sobre "FBA e SQL Server: Unha Historia de Amor

  1. David precoz
    Desculpem-me por publicar esta pregunta non relacionada, pero eu non podía descubrir como enviar un correo-e a partir deste blog.
    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.
    Responder

Deixe unha resposta

Enderezo de correo electrónico non será publicado. Os campos obrigatorios están marcados *