Поскольку это ASMX, я думаю, что он относится к правилам олицетворения ASP.NET. Поскольку программно нет функции входа в систему, вы должны использовать неуправляемый API.
Допустим, вам нужно что-то делать в контексте олицетворения (под учетной записью пользователя на удаленном компьютере, у которого есть доступ в нужном вам месте).
Impersonation.Execute(myEntity.NasUser, myEntity.NasPassword, () =>
{
//Copy File to UNC Path for example
File.Copy(sourceFile, Path.Combine(myEntity.UploadPath, Path.GetFileName(sourceFile)), true);
});
Импорт неуправляемых API:
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken
);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);
Вышеупомянутое выполнение может быть примерно таким:
public static void Execute(string userName, string domain, string password, Action action)
{
try
{
bool bImpersonated = LogonUser(
userName,
domain,
password,
logon32LogonInteractive,
logon32ProviderDefault,
out tokenHandle);
if (bImpersonated == false)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
WindowsIdentity newId = new WindowsIdentity(tokenHandle);
impersonatedUser = newId.Impersonate();
action();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (impersonation != null)
impersonation.Dispose();
}
}
Вы не должны забывать отменить олицетворение и вернуться в предыдущее состояние windowscredentials:
public void Dispose()
{
// Stop impersonating the user.
if (impersonatedUser != null)
impersonatedUser.Undo();
// close handle
if (tokenHandle != IntPtr.Zero)
CloseHandle(tokenHandle);
}