IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

[.NetCore] Impersonate en tant qu'administrateur


Sujet :

ASP.NET MVC

  1. #1
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut [.NetCore] Impersonate en tant qu'administrateur
    Bonjour,
    Je suis sur un application .netCore mvc dans laquelle j'ai un controlleur qui fait appel à un service.
    Ce service doit modifier une propriété sur les comptes active directory.
    Bien sûr il faut des droits spécifiques que n'ont pas les utilisateurs courant de l'application.

    Je souhaiterais donc savoir si je peux encapsuler le code de mon service pour qu'il tourne avec l'identité d'un compte priviliégié au lieu de l'identité de l'utilisateur?
    Un équivalent de "SPSecurity.runwithelevatedprivileges" pour ceux qui connaissent SharePoint.

    Merci par avance pour vos conseils.

  2. #2
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    j'ai trouvé la réponse à ma question.
    La voici très largement inspirée de code trouvé sur internet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    using System;
    using System.Security.Principal;
     
    namespace WebApp.Util
    {
        public class ImpersonateUser : System.IDisposable
        {
            protected const int LOGON32_PROVIDER_DEFAULT = 0;
            protected const int LOGON32_LOGON_INTERACTIVE = 2;
     
            public WindowsIdentity Identity = null;
            private System.IntPtr m_accessToken;
     
     
            [System.Runtime.InteropServices.DllImport("advapi32.dll", SetLastError = true)]
            private static extern bool LogonUser(string lpszUsername, string lpszDomain,
            string lpszPassword, int dwLogonType, int dwLogonProvider, ref System.IntPtr phToken);
     
            [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
            private extern static bool CloseHandle(System.IntPtr handle);
     
     
            public ImpersonateUser()
            {
                this.Identity = WindowsIdentity.GetCurrent();
            }
     
     
            public ImpersonateUser(string username, string domain, string password)
            {
                Login(username, domain, password);
            }
     
     
            public void Login(string username, string domain, string password)
            {
                if (this.Identity != null)
                {
                    this.Identity.Dispose();
                    this.Identity = null;
                }
     
     
                try
                {
                    this.m_accessToken = new System.IntPtr(0);
                    Logout();
     
                    this.m_accessToken = System.IntPtr.Zero;
                    bool logonSuccessfull = LogonUser(
                       username,
                       domain,
                       password,
                       LOGON32_LOGON_INTERACTIVE,
                       LOGON32_PROVIDER_DEFAULT,
                       ref this.m_accessToken);
     
                    if (!logonSuccessfull)
                    {
                        int error = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
                        throw new System.ComponentModel.Win32Exception(error);
                    }
                    Identity = new WindowsIdentity(this.m_accessToken);
                }
                catch
                {
                    throw;
                }
     
            } 
     
     
            public void Logout()
            {
                if (this.m_accessToken != System.IntPtr.Zero)
                    CloseHandle(m_accessToken);
     
                this.m_accessToken = System.IntPtr.Zero;
     
                if (this.Identity != null)
                {
                    this.Identity.Dispose();
                    this.Identity = null;
                }
     
            } 
     
     
            void System.IDisposable.Dispose()
            {
                Logout();
            } 
        } 
    }

    à utiliser comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                 using (ImpersonateUser admin = new ImpersonateUser(_adSettings.ADUser, _adSettings.DomainName, _adSettings.ADPassword))
                {
                    WindowsIdentity.RunImpersonated(admin.Identity.AccessToken, () =>
                    {
                          // code à éxecuter en tant qu'admin
                    });
                }

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Points : 35
    Points
    35
    Par défaut
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Connecté en tant qu'administrateur ?
    Par KoYzimus dans le forum Vos Contributions VBScript
    Réponses: 2
    Dernier message: 19/06/2009, 16h12
  2. insertion valeur null en tant qu'administrateur
    Par new_wave dans le forum SQL
    Réponses: 3
    Dernier message: 06/11/2007, 11h28
  3. Réponses: 0
    Dernier message: 21/10/2007, 16h44
  4. Réponses: 1
    Dernier message: 26/07/2007, 01h37
  5. Réponses: 3
    Dernier message: 27/04/2007, 19h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo