SORU
24 EYLÜL 2008, ÇARŞAMBA


Nasıl taklit ediyorsun .NET?

Bir kullanıcının kimliğine bürünmek için kutusu basit bir yolu var .NET?

Şimdiye kadar tüm bürünme benim gereksinimleri için this class from code project kullanıyorum.

Daha iyi bir yol kullanarak bunu yapmak için var .NET Çerçeve?

Bir kullanıcı var taklit etmek istiyorum kimliğini temsil eden kimlik, (kullanıcı adı, parola, etki alanı adı).

CEVAP
30 AĞUSTOS 2011, Salı


Bu konuda birden fazla mesaj ile atlama sonra, nihayet bürünme bütün mantık saklanması için basit bir sınıf ile geldi. Böyle basit bir arama yapmak için izin verir:

using (new Impersonation(domain, username, password))
{
    // do whatever you want
}

Projenize bu sınıf eklemek ve uzağa gitmek:

using System;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Security.Principal;
using Microsoft.Win32.SafeHandles;

namespace MyApplication
{
    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    public class Impersonation : IDisposable
    {
        private readonly SafeTokenHandle _handle;
        private readonly WindowsImpersonationContext _context;

        const int LOGON32_LOGON_NEW_CREDENTIALS = 9;

        public Impersonation(string domain, string username, string password)
        {
            var ok = LogonUser(username, domain, password,
                           LOGON32_LOGON_NEW_CREDENTIALS, 0, out this._handle);
            if (!ok)
            {
                var errorCode = Marshal.GetLastWin32Error();
                throw new ApplicationException(string.Format("Could not impersonate the elevated user.  LogonUser returned error code {0}.", errorCode));
            }

            this._context = WindowsIdentity.Impersonate(this._handle.DangerousGetHandle());
        }

        public void Dispose()
        {
            this._context.Dispose();
            this._handle.Dispose();
        }

        [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);

        public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
        {
            private SafeTokenHandle()
                : base(true) { }

            [DllImport("kernel32.dll")]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            [SuppressUnmanagedCodeSecurity]
            [return: MarshalAs(UnmanagedType.Bool)]
            private static extern bool CloseHandle(IntPtr handle);

            protected override bool ReleaseHandle()
            {
                return CloseHandle(handle);
            }
        }
    }
}

Oturum açma türü 9 (Yeni kimlik) kullanıyorum unutmayın. Benim durumumda, bu en iyi çalışır, bu yüzden farklı bir login ile sql server güvenilen güvenlik üzerinden bağlanmak istiyorum. Diffferent bir oturum açma türü amaçlarınıza bağlı olarak gerekebilir. Diğer oturum türleri için this site bakabilirsiniz.


GÜNCELLEME

Sürekli olumlu geribildirim dayanarak, bu ayarlar biraz daha temiz ve daha kolay tüketim için bir kütüphane ev sahipliği yapmaya karar verdim. NuGet GitHub, kullanıma hazır, kaynak ve dokümanlar. Tadını çıkarın!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Darren Kitchen

    Darren Kitch

    3 EKİM 2011
  • jocc talking shit

    jocc talking

    6 NİSAN 2007