Saya memiliki situs web ASP.NET MVC yang menggunakan Otentikasi Windows untuk mengontrol akses. Saya ingin melakukan tes specflow Selenium yang memeriksa apakah konfigurasi sudah benar dengan mencoba mengunjungi situs sebagai pengguna yang tidak sah.
Karena kami menggunakan akun domain untuk mengontrol akses, tidak ada layar login nama pengguna/kata sandi. Kredensial pengguna saat ini secara otomatis diteruskan ke situs oleh browser.
Jadi untuk tes Selenium saya, saya harus bisa menjalankan Internet Explorer sebagai pengguna tertentu.
Saya telah menemukan sejumlah artikel tentang peniruan identitas Windows dan saya dapat beralih ke pengguna pengujian saya selama menjalankan pengujian (menggunakan kode dari http://support.microsoft.com/kb/306158). Namun jika saya kemudian membuat InternetExplorerDriver, ia memulai internet explorer dengan kredensial saya, bukan dengan pengguna uji (walaupun pertanyaan dan jawaban ini menyarankan bahwa itu harus berfungsi https://sqa.stackexchange.com/questions/2277/using-selenium-webdriver-with-windows-authentication).
Saya juga dapat secara eksplisit memulai proses Internet Explorer sebagai pengguna pengujian saya, tetapi saya tidak dapat melihat cara untuk mengikat InternetExplorerDriver ke proses Internet Explorer yang sudah berjalan, jadi ini mungkin jalan buntu.
Kode saya, pada dasarnya diambil dari halaman MSDN di atas ada di bawah. Di debugger saya dapat melihat bahwa WindowsIdentity.GetCurrent().Name adalah "testUser" di semua langkah pengujian.
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();
}
}
}
driver
instantiasi Anda sebelumimpersonateValidUser(..)
- person ddavison   schedule 20.01.2015runas /user:USER@DOMIAN path\to\mstest.exe ...
- person Greg Burghardt   schedule 28.01.2015