Как я могу запустить тесты Internet Explorer Selenium от имени конкретного пользователя домена?

У меня есть веб-сайт ASP.NET MVC, который использует проверку подлинности Windows для контроля доступа. Я хотел бы провести тест на селен в specflow, который проверяет правильность конфигурации, пытаясь зайти на сайт как не авторизованный пользователь.

Поскольку мы используем учетные записи домена для контроля доступа, здесь нет экрана входа в систему с именем пользователя / паролем. Учетные данные текущего пользователя автоматически передаются на сайт браузером.

Поэтому для моего теста Selenium мне нужно иметь возможность запускать Internet Explorer от имени конкретного пользователя.

Я нашел несколько статей об олицетворении Windows, и я могу переключиться на моего тестового пользователя во время выполнения теста (используя код изhttp://support.microsoft.com/kb/306158). Однако если я затем создаю InternetExplorerDriver, он запускает Internet Explorer с моими учетными данными, а не с тестовым пользователем (хотя этот вопрос и ответ предполагают, что он должен работатьhttps://sqa.stackexchange.com/questions/2277/using-selenium-webdriver-with-windows-authentication).

Я также могу явно запустить процесс Internet Explorer как мой тестовый пользователь, но я не вижу способа привязать InternetExplorerDriver к уже запущенному процессу Internet Explorer, так что это может быть тупик.

Мой код, в основном взят из страницы MSDN выше, ниже. В отладчике я вижу, что WindowsIdentity.GetCurrent (). Name - это «testUser» на всех этапах теста.

namespace MyProject.Specs
{
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.IE;
using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using TechTalk.SpecFlow;

[Binding]
public class AuthorisationSteps
{
    public const int LOGON32_LOGON_INTERACTIVE = 2;
    public const int LOGON32_PROVIDER_DEFAULT = 0;
    private static WindowsImpersonationContext impersonationContext;
    private static IWebDriver driver;

    [BeforeScenario]
    public static void impersonateUser()
    {
        if (!impersonateValidUser("testUser", "testDomain", "password"))
        {
            throw new Exception();
        }
        driver = new InternetExplorerDriver();
    }

    [AfterScenario]
    public static void cleanupUser()
    {
        undoImpersonation();
        driver.Quit();
    }

    [Given(@"I am an unauthorised user")]
    public void GivenIAmAnUnauthorisedUser()
    {
        var temp = WindowsIdentity.GetCurrent().Name;
    }

    [When(@"I go to the home page")]
    public void WhenIGoToTheHomePage()
    {
        var temp = WindowsIdentity.GetCurrent().Name;
        driver.Navigate().GoToUrl(BaseUrl);
    }

    [Then(@"I should see an error page")]
    public void ThenIShouldSeeAnErrorPage()
    {
        var temp = WindowsIdentity.GetCurrent().Name;
        Assert.That(driver.Title.Contains("Error"));
    }

    [DllImport("advapi32.dll")]
    public static extern int LogonUserA(String lpszUserName,
                                        String lpszDomain,
                                        String lpszPassword,
                                        int dwLogonType,
                                        int dwLogonProvider,
                                        ref IntPtr phToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int DuplicateToken(IntPtr hToken,
                                            int impersonationLevel,
                                            ref IntPtr hNewToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool RevertToSelf();

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern bool CloseHandle(IntPtr handle);

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

        if (RevertToSelf())
        {
            if (LogonUserA(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)
                    {
                        CloseHandle(token);
                        CloseHandle(tokenDuplicate);
                        return true;
                    }
                }
            }
        }
        if (token != IntPtr.Zero)
        {
            CloseHandle(token);
        }
        if (tokenDuplicate != IntPtr.Zero)
        {
            CloseHandle(tokenDuplicate);
        }
        return false;
    }

    private static void undoImpersonation()
    {
        impersonationContext.Undo();
    }
}

}

Ответы на вопрос(8)

Ваш ответ на вопрос