Watin проверка подлинности Windows

Я пытаюсь написать тесты Watin для приложения интрасети, использующего встроенную аутентификацию. Веб-страница, которую я пытаюсь протестировать, печатает Page.User.Identity.Name.

Вот часть кода из моего теста:

if (Win32.LogonUser(u.UserName, u.Domain, u.Password, 2 /*LOGON32_LOGON_INTERACTIVE*/, 0 /*LOGON32_PROVIDER_DEFAULT*/, out hToken))
            {
                if (Win32.DuplicateToken(hToken, 2, out hTokenDuplicate))
                {
                    WindowsIdentity windowsIdentity = new WindowsIdentity(hTokenDuplicate);
                    WindowsImpersonationContext impersonationContext = windowsIdentity.Impersonate();  

                    Console.WriteLine(WindowsIdentity.GetCurrent().Name);

                    using (IE ie = new IE(url))
                    {
                        Console.WriteLine(ie.ContainsText(u.UserName));
                        ie.AutoClose = false;
                    }

                    impersonationContext.Undo();
                }
            }

Когда я запускаю это, он выводит на консоль имя пользователя, которое я пытаюсь выдать за другое лицо, но на веб-странице отображается пользователь, под которым я в настоящее время вошел в систему, а не тот, за которого я должен выдавать себя.

Аналогичная проблема обнаружена по адресу:
Автоматическое тестирование сценариев авторизации, реализованных с помощью AzMan


person Bradley Landis    schedule 13.07.2009    source источник


Ответы (1)


Выдавать себя за другое лицо сложно, и мне никогда не удавалось заставить IE работать в качестве другого пользовательского контекста с WatiN. Раньше я развертывал другую версию тестируемого сайта с включенной базовой аутентификацией, а затем входил в систему через диалоговое окно.

Загляните в следующие блоги для получения дополнительной информации и примеров кода:

http://blogs.msdn.com/jimmytr/archive/2007/04/14/writing-test-code-with-impersonation.aspx

http://blogs.msdn.com/shawnfa/archive/2005/03/21/400088.aspx

Изменить: у меня это работает сегодня. Хитрость заключается в том, что вам нужно разделить запуск IE и автоматизацию IE, поскольку вы не можете сделать и то, и другое за один раз.

Первый запуск, то есть с помощью System.Diagnostics.Process. После запуска IE вы можете использовать код из здесь, чтобы подключиться и поговорить с IE с помощью олицетворения

Вот код

    [TestMethod]
    public void TestMethod()
    {
        SecureString password = new SecureString();
        password.AppendChar('p');
        password.AppendChar('a');
        password.AppendChar('s');
        password.AppendChar('s');
        password.AppendChar('w');
        password.AppendChar('o');
        password.AppendChar('r');
        password.AppendChar('d');

        ProcessStartInfo psi = new ProcessStartInfo();
        psi.UserName = "localtest";
        psi.Password = password;
        psi.UseShellExecute = false;
        psi.LoadUserProfile = true;
        psi.FileName = "c:\\Program Files\\Internet Explorer\\iexplore.exe";
        psi.Arguments = "about:blank";

        Process proc = new Process();
        proc.StartInfo = psi;
        proc.Start();

        t.Join();

        proc.Kill(); 
    }

    private static void DoWorkAs(object o)
    {
        User u = o as User;


        IntPtr hToken = IntPtr.Zero;
        IntPtr hTokenDuplicate = IntPtr.Zero;

        if (Win32.LogonUser(u.UserName, u.Domain, u.Password, 2 /*LOGON32_LOGON_INTERACTIVE*/, 0 /*LOGON32_PROVIDER_DEFAULT*/, out hToken))
        {
            if (Win32.DuplicateToken(hToken, 2, out hTokenDuplicate))
            {
                WindowsIdentity windowsIdentity = new WindowsIdentity(hTokenDuplicate);
                WindowsImpersonationContext impersonationContext = windowsIdentity.Impersonate();

                // domain\username
                Console.WriteLine(" Thread 2 : " + WindowsIdentity.GetCurrent().Name);

                IE ie = IE.AttachToIE(Find.ByUrl("about:blank"));

                ie.GoTo(@"http://www.google.com/");
                ie.TextField(Find.ByName("q")).TypeText("WatiN");
                ie.Button(Find.ByName("btnG")).Click();

                Assert.IsTrue(ie.ContainsText("WatiN"));
                ie.GoTo("about:blank");

                //revert
                impersonationContext.Undo();
                Console.WriteLine(WindowsIdentity.GetCurrent().Name);
            }
        }
        if (hToken != IntPtr.Zero) Win32.CloseHandle(hToken);
        if (hTokenDuplicate != IntPtr.Zero) Win32.CloseHandle(hTokenDuplicate);
    }

    public class User
    {
        public User(string u, string d, string p)
        {
            Domain = d;
            UserName = u;
            Password = p;
        }
        public string UserName;
        public string Domain;
        public string Password;
    }
    public class Win32
    {
        // P/Invoke snask
        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern bool LogonUser(
            string lpszUsername,
            string lpszDomain,
            string lpszPassword,
            int dwLogonType,
            int dwLogonProvider,
            out IntPtr phToken);

        [DllImport("advapi32.dll", SetLastError = true)]
        public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int
           SECURITY_IMPERSONATION_LEVEL, out IntPtr DuplicateTokenHandle);

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool CloseHandle(IntPtr hHandle);

    }

Этот код требует рефакторинга, и он не будет работать в Vista с IE7 из-за ошибки IE, которая была исправлена ​​в IE8.

person Bruce McLeod    schedule 14.07.2009
comment
Спасибо, Брюс. Это дало нам решение, которое позволило нам двигаться вперед. Я бы хотел, чтобы в будущем WatiN добавила какую-то поддержку олицетворения. - person Bradley Landis; 15.07.2009
comment
Здесь не хватает кода? Где определяется 't' и где вы когда-либо вызываете DoWorkAs ()? - person Derek Greer; 02.03.2011
comment
@Derek Я сказал, что код требует перефактора .. Исходный код включен в мою структуру с открытым исходным кодом здесь testingstax.codeplex.com/SourceControl/changeset/view/ - person Bruce McLeod; 04.03.2011