Wie kann ich Internet Explorer Selenium-Tests als bestimmter Domänenbenutzer ausführen?

Ich habe eine ASP.NET MVC-Website, die die Windows-Authentifizierung verwendet, um den Zugriff zu steuern. Ich möchte einen Specflow-Selentest durchführen lassen, der überprüft, ob die Konfiguration korrekt ist, indem versucht wird, die Site als nicht autorisierter Benutzer aufzurufen.

Da wir Domänenkonten verwenden, um den Zugriff zu steuern, gibt es keinen Anmeldebildschirm für Benutzername / Kennwort. Die Anmeldeinformationen des aktuellen Benutzers werden vom Browser automatisch an die Site übergeben.

Zu meinem Selenium-Test muss ich in der Lage sein, Internet Explorer als bestimmten Benutzer auszuführen.

Ich habe eine Reihe von Artikeln über den Windows-Identitätswechsel gefunden und kann während der Ausführung des Tests zu meinem Testbenutzer wechseln (mit dem Code vonhttp: //support.microsoft.com/kb/30615). Wenn ich dann jedoch einen InternetExplorerDriver erstelle, wird der Internet Explorer mit meinen Anmeldeinformationen und nicht mit denen des Testbenutzers gestartet (obwohl diese Frage und Antwort darauf hindeutet, dass dies funktionieren solltehttps: //sqa.stackexchange.com/questions/2277/using-selenium-webdriver-with-windows-authenticatio).

Ich kann einen Internet Explorer-Prozess auch explizit als Testbenutzer starten, aber ich kann keinen Weg finden, einen InternetExplorerDriver an einen bereits ausgeführten Internet Explorer-Prozess zu binden, sodass dies möglicherweise eine Sackgasse darstellt.

Mein Code, der im Wesentlichen von der obigen MSDN-Seite stammt, ist unten. Im Debugger kann ich sehen, dass WindowsIdentity.GetCurrent (). Name ist "testUser" in allen Schritten des Tests.

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();
    }
}

}

Antworten auf die Frage(16)

Ihre Antwort auf die Frage