Meu colega tem trabalhado em uma web part em um ambiente de FBA. Entre outras coisas, a web part puxa alguns dados do SQL server. O grande plano para este projeto dita que um DBA configura o nível de segurança de dados em SQL (em oposição a incorporação de um ID de usuário em uma consulta SQL ou outra abordagem).
O problema é que do SQL server não sabe de nada sobre o nosso ambiente de FBA para que ele não pode confiar em nós. Nós resolvemos esse problema por, por falta de uma palavra melhor, manualmente, fingindo ser um usuário do AD para que nós pôde se conectar ao SQL tais que obras de segurança de nível de dados SQL.
Mesmo que o FBA é um recurso do ASP.NET, Nós, povo de nação do SharePoint têm ensinado os vários motores de busca que você está consultando para FBA, Você deve dizer que você quer saber como configurar o FBA no SharePoint. Não consegui encontrar encontrar qualquer informação sobre como habilitar um FBA orientado ASP.NET aplicativo para se comunicar com o SQL da forma que precisávamos.
No decurso de pesquisando sobre isso, Vamos voltar a ler este artigo: Representação do ASP.net
Mais pesquisa nos levou a este artigo de codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
Que nos ajudou a escrever nosso código, que eu incluí abaixo. Não é a coisa mais elegante, Mas funcionou. Espero que você ache útil.
Aqui está o código que trabalhou para nós:
protegido Sub btnSearchCarrier_Click(Object sender, EventArgs e) { Tente { ImpersonateUser iU = Novo ImpersonateUser(); // TODO: Substituir iU.Impersonate de credenciais("Nome_do_domínio", "UserName", "Senha"); // CÓDIGO // iU.Undo(); } pegar (Exceção ex) { } } // Usando a classe de representação como mencionado abaixo. público Classe ImpersonateUser { [DllImport("advapi32. dll", SetLastError = verdadeiro)] público estático extern bool LogonUser( LpszUsername de seqüência de caracteres, LpszDomain de seqüência de caracteres, LpszPassword de seqüência de caracteres, int dwLogonType, int dwLogonProvider, Ref IntPtr phToken); [DllImport("Kernel32. dll", CharSet = Charset. auto)] privada extern estático bool CloseHandle(IntPtr handle); privada estático IntPtr tokenHandle = Novo IntPtr(0); privada estático ImpersonatedUser WindowsImpersonationContext; // Se você incorporar esse código em uma DLL, Certifique-se de exigir que ele // corre com FullTrust. [PermissionSetAttribute(SecurityAction. Demand, Nome = "FullTrust")] público void Impersonate(seqüência de caracteres nome de domínio, seqüência de caracteres nome de usuário, senha de seqüência de caracteres) { Tente { // Use a função LogonUser gerenciada para obter o usuário token para // o usuário especificado, domínio, e senha. const int LOGON32_PROVIDER_DEFAULT = 0; // Passando este parâmetro faz com que LogonUser criar um token primário. const int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr. zero; // Passo -1 Chamada LogonUser para obter um identificador para um token de acesso. As Boolean returnValue = LogonUser( nome de usuário, domainName, senha, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, Ref tokenHandle); // tokenHandle - novo token de segurança se (false = = returnValue) { int ret = GetLastWin32Error(); Console. WriteLine("Chamada LogonUser falha com código de erro : " + RET); jogar novo System. ComponentModel.Win32Exception(RET); } // Passo - 2 WindowsIdentity newId = Novo WindowsIdentity(tokenHandle); // Passo -3 impersonatedUser = newId.Impersonate(); } pegar (Exceção ex) { Console. WriteLine("Ocorreu uma exceção. " + ex.Mensagem); } } /// <Resumo> /// Representação de paragens /// </Resumo> público Sub desfazer() { impersonatedUser.Undo(); // Grátis os tokens. se (tokenHandle != IntPtr. zero) CloseHandle(tokenHandle); } }
</fim>