Adomd .net, le provider qui se sent bien qu’en localhost

vous étiez tranquillement devant votre Visual studio en train de développer une application qui allait requêter des cubes OLAP sur un serveur distant et là surprise ! vous ne pouvez pas vous connecter à Analysis Services (encore un grand merci à Billou* et ses acolytes).

Et oui comme vous avez pu le remarquer le seul mode d’authentification à Analysis Services est l’autentification windows.

Enfin bon heureusement il existe deux solutions 🙂

  • la première qui est des plus sale, est d’accepter les connexions anonymes dans Analysis Services.
  • La deuxième (un peu moins sale, mais pas complètement), est d’utiliser l’impersonation

je vais donc décrire la deuxième solution puisque la première est trop sale et pas compliquée (même corky pourrait y arriver !)

L’impersonation qu’est-ce donc c’est un procédé d’usurpation d’identité (et oui microsoft propose ce genre de chose !), il permet de se faire passer pour un autre utilisateur le temps d’exécution d’un bout decode ou tout le code complet.

Dans le cas où l’on souhaite utiliser l’impersonation pour toute l’application Asp .net, il faut placer ce bout de code dans le fichier web.config

<identity impersonate="true" userName="nomducompte" password="motdepasse" />

Dans le cas où l’on veut utiliser cette impersonation juste lors de l’exécution d’un bout de code (connexion à un cube OLAP par exemple), il faut implémenter ce bout de code :

code c# .net :

<%@ Page Language="C#"%>
<%@ Import Namespace = "System.Web" %>
<%@ Import Namespace = "System.Web.Security" %>
<%@ Import Namespace = "System.Security.Principal" %>
<%@ Import Namespace = "System.Runtime.InteropServices" %>

<script runat=server>
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;

WindowsImpersonationContext impersonationContext; 

[DllImport("advapi32.dll", CharSet=CharSet.Auto)]
public static extern int LogonUser(String lpszUserName,
                                  String lpszDomain,
                                  String lpszPassword,
                                  int dwLogonType,
                                  int dwLogonProvider,
                                  ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
public extern static int DuplicateToken(IntPtr hToken,
                                  int impersonationLevel,
                                  ref IntPtr hNewToken);

public void Page_Load(Object s, EventArgs e)
{
   if(impersonateValidUser("nomutilisateur", "domaine", "motdepasse"))
   {
      // Insérez ici le code qui s'exécute dans le contexte de sécurité de l'utilisateur particulier.
      undoImpersonation();
   }
   else
   {
      // L'emprunt d'identité a échoué. Par conséquent, insérez ici un mécanisme de prévention de défaillance.
   }
}

private bool impersonateValidUser(String userName, String domain, String password)
{
   WindowsIdentity tempWindowsIdentity;
   IntPtr token = IntPtr.Zero;
   IntPtr tokenDuplicate = IntPtr.Zero;

   if(LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
   LOGON32_PROVIDER_DEFAULT, ref token) != 0)
   {
      if(DuplicateToken(token, 2, ref tokenDuplicate) != 0)
      {
         tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
         impersonationContext = tempWindowsIdentity.Impersonate();
         if (impersonationContext != null)
            return true;
         else
            return false;
      }
      else
         return false;
   }
   else
      return false;
}
private void undoImpersonation()
{
   impersonationContext.Undo();
}
</script>

voila pour le tips du jour !

(* paix à son âme, il est parti en retraite).

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *