Mon collègue a travaillé sur un composant WebPart dans un environnement de FBA. Entre autres choses, le composant WebPart tire des données de SQL server. Le grand plan de ce projet exige qu'un DBA configure la sécurité niveau de données dans SQL (par opposition à l'incorporation d'un ID utilisateur dans une requête SQL ou d'une autre approche).
Le problème est que SQL server ne sait rien notre environnement EEA, donc il ne peut pas nous faire confiance. Nous avons résolu ce problème en, faute d'un meilleur mot, passer manuellement pour un utilisateur AD afin que nous pourrions nous connecter à SQL telles que données SQL niveau sécurité travaux.
Bien qu'EEA est une fonctionnalité d'ASP.NET, nous, peuple de SharePoint Nation avons enseigné la recherche de divers moteurs que si vous vous interrogez pour FBA, vous voulez savoir comment configurer FBA dans SharePoint doit dire. Je n'ai pas trouver tout renseignement sur la façon d'activer un FBA orienté application ASP.NET pour communiquer avec SQL dans la façon dont nous avions besoin de trouver.
Dans le cadre des recherches sur ce, Nous re-lire cet article: Emprunt d'identité ASP.NET
Plus de recherche nous a conduit à cet article codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
Qui nous a aidé à écrire notre code, qui j'ai inclus ci-dessous. Il n'est pas les trucs plus chics, mais cela a fonctionné. J'espère que vous trouverez utile.
Voici le code qui a fonctionné pour nous:
protégé Sub btnSearchCarrier_Click(ByVal sender, EventArgs e) { Essayez { ImpersonateUser UI = Nouveau ImpersonateUser(); // TODO: Remplacer les informations d'identification iU.Impersonate(« DomainName », « Nom d'utilisateur », « Password »); // CODE // iU.Undo(); } captures (System.Exception ex) { } } // À l'aide de la classe de l'emprunt d'identité comme mentionné ci-dessous. public classe ImpersonateUser { [DllImport(« advapi32.dll », SetLastError = True)] public statique extern bool LogonUser( Chaîne lpszUsername, Chaîne lpszDomain, Chaîne lpszPassword, int dwLogonType, int dwLogonProvider, Réf IntPtr phToken); [DllImport(« kernel32.dll », CharSet = CharSet.Auto)] privé extern statique bool CloseHandle(Handle IntPtr); privé statique IntPtr tokenHandle = Nouveau IntPtr(0); privé statique WindowsImpersonationContext impersonatedUser; // Si vous intégrer ce code dans une DLL, n'oubliez pas d'exiger qu'elle // fonctionne avec FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Nom = « FullTrust »)] public Impersonate Sub(chaîne NomDomaine, String userName, mot de passe de chaîne) { Essayez { // Utilisez la fonction non managée LogonUser pour obtenir l'utilisateur jeton // l'utilisateur spécifié, domaine, et le mot de passe. const int LOGON32_PROVIDER_DEFAULT = 0; // En passant ce paramètre provoque LogonUser créer un jeton principal. const int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr.Zero; // Étape -1 Appeler LogonUser pour obtenir un handle sur un jeton d'accès. bool returnValue = LogonUser( nom d'utilisateur, nom de domaine, mot de passe, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, Réf tokenHandle); // tokenHandle - nouveau jeton de sécurité Si (== false returnValue) { int ret = Marshal.GetLastWin32Error(); Console.WriteLine(« Appel de LogonUser a échoué avec le code d'erreur : " + RET); jeter nouveau System.ComponentModel.Win32Exception(RET); } // Étape - 2 WindowsIdentity newId = Nouveau WindowsIdentity(tokenHandle); // Étape -3 impersonatedUser = newId.Impersonate(); } captures (System.Exception ex) { Console.WriteLine("Exception s'est produite. " + ex.Message); } } /// <Résumé> /// Emprunt d'identité s'arrête /// </Résumé> public Undo Sub() { impersonatedUser.Undo(); // Libérer les jetons. Si (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</fin>