سؤال

أنا أستخدم API LogonUser Win32:

token = LogonUser(...)
WindowsIdentity newId = new WindowsIdentity(token);            
WindowsImpersonationContext impersonatedUser = newId.Impersonate();

ومع ذلك عند استدعاء خدمة WCF بعد ذلك، أنا غير قادر على استخدام الهوية المنتحل. أعتقد أن هذا بسبب انتحال شخصية.ImpersonationLevel يساوي الانتحال.

هل هذا هو السبب؟ هو مستوى من الانتحالل.يدفيد ما أحتاجه؟ كيفية الحصول على هذا المستوى؟

هل كانت مفيدة؟

المحلول

لا أعرف ما إذا كان هذا سيعمل من أجل WCF. لكننا نستخدمها في تطبيق Web الإنتاج الخاص بنا للانتحال لقراءة الملفات وكتابةها لنظام الملفات. ستحتاج إلى تحديد API للحصول على ADVAPI32.logonuser، Advapi32.duplicatetEken، و Kernel32.Closehandle وتأكد من إغلاق WindowsImpersonationContext عند الانتهاء.

    /// <summary>impersonates a user</summary>
    /// <param name="username">domain\name of the user account</param>
    /// <param name="password">the user's password</param>
    /// <returns>the new WindowsImpersonationContext</returns>
    public static WindowsImpersonationContext ImpersonateUser(String username, String password)
    {
        WindowsIdentity winId = WindowsIdentity.GetCurrent();
        if (winId != null)
        {
            if (string.Compare(winId.Name, username, true) == 0)
            {
                return null;
            }
        }

        //define the handles
        IntPtr existingTokenHandle = IntPtr.Zero;
        IntPtr duplicateTokenHandle = IntPtr.Zero;

        String domain;
        if (username.IndexOf("\\") > 0)
        {
            //split domain and name
            String[] splitUserName = username.Split('\\');
            domain = splitUserName[0];
            username = splitUserName[1];
        }
        else
        {
            domain = String.Empty;
        }

        try
        {
            //get a security token

            bool isOkay = AdvApi32.LogonUser(username, domain, password,
                (int) AdvApi32.LogonTypes.LOGON32_LOGON_INTERACTIVE,
                (int) AdvApi32.LogonTypes.LOGON32_PROVIDER_DEFAULT,
                ref existingTokenHandle);

            if (!isOkay)
            {
                int lastWin32Error = Marshal.GetLastWin32Error();
                int lastError = Kernel32.GetLastError();

                throw new Exception("LogonUser Failed: " + lastWin32Error + " - " + lastError);
            }

            // copy the token

            isOkay = AdvApi32.DuplicateToken(existingTokenHandle,
                (int) AdvApi32.SecurityImpersonationLevel.SecurityImpersonation,
                ref duplicateTokenHandle);

            if (!isOkay)
            {
                int lastWin32Error = Marshal.GetLastWin32Error();
                int lastError = Kernel32.GetLastError();
                Kernel32.CloseHandle(existingTokenHandle);
                throw new Exception("DuplicateToken Failed: " + lastWin32Error + " - " + lastError);
            }
            // create an identity from the token

            WindowsIdentity newId = new WindowsIdentity(duplicateTokenHandle);
            WindowsImpersonationContext impersonatedUser = newId.Impersonate();

            return impersonatedUser;
        }
        finally
        {
            //free all handles
            if (existingTokenHandle != IntPtr.Zero)
            {
                Kernel32.CloseHandle(existingTokenHandle);
            }
            if (duplicateTokenHandle != IntPtr.Zero)
            {
                Kernel32.CloseHandle(duplicateTokenHandle);
            }
        }
    }

نصائح أخرى

بعد ذلك، أنا غير قادر على استخدام الهوية المنتحركة

يجب أن يكون الانتحال فعالا للوصول إلى المربع نفسه، ولكن ليس على الشبكة.

قد يكون الأمر كذلك، حيث تظهر شفرة Consertah، أنك تحتاج فقط إلى الاتصال Duplicatetoken () من أجل تحويل رمز تسجيل الدخول إلى رمز الانتحال قبل استخدامه.

أعتقد أن هذا بسبب انتحال شخصية.ImpersonationLevel يساوي الانتحال.

إذا كنت بحاجة إلى التصرف كمستخدم ينتحمل أنظمة أخرى، فأنت بحاجة إلى مستوى أعلى من الانتحال المسمى "الوفد". هذا يعادل أساسا الحصول على كلمة مرور المستخدم حتى تتمكن من تمثيل نفسك كما لهم للآخرين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top