我正在使用以下Microsoft example。每次WindowsIdentity实例调用.Impersonate()时,都不会发生任何事情。没有错误,没有假冒。
在呼叫之前和之后,当前身份始终是AppPool身份
我还尝试了另一个在线发现的例子,the Impersonator class,同样的事情发生了。
我对这些示例所做的唯一修改是在LogOnUser调用中将LOGON32_LOGON_INTERACTIVE更改为LOGON32_LOGON_NETWORK,因为使用Interactive始终返回0错误。
这是一个在Win2k8服务器上运行的ASP.NET 4.0应用程序,试图模仿AD中的用户。
修改
我最初没有提到这个,但我修改了Microsoft示例并将其转换为类,以便我可以从我的ASP.NET应用程序中获取它。我在web.config中也有impersonate=true
。
答案 0 :(得分:1)
我最终找到了一个辅助课,几年前我做过类似的事情。帮助器实现了IDisposable,所以只需将文件访问代码包装成“使用”,如下所示: -
using (Impersonate imp = new Impersonate())
{
// Code in here will run under the identity specified in the helper
}
这是助手类的代码(我删除了“使用”以节省一些空间)。您会注意到用户帐户在构造函数中是硬编码的:
internal class Impersonate : IDisposable
{
private const int LOGON32_LOGON_INTERACTIVE = 2;
private const int LOGON32_PROVIDER_DEFAULT = 0;
private bool _disposed = false;
private WindowsImpersonationContext _context = null;
[DllImport("advapi32.dll")]
private 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)]
private static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool RevertToSelf();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern bool CloseHandle(IntPtr handle);
internal Impersonate()
{
WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
string domain = "<whatever>";
string username = "<whatever>";
string password = "<whatever>";
try
{
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);
_context = tempWindowsIdentity.Impersonate();
}
}
}
}
finally
{
if (token != IntPtr.Zero)
{
CloseHandle(token);
}
if (tokenDuplicate != IntPtr.Zero)
{
CloseHandle(tokenDuplicate);
}
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// Dispose any managed resources here.
}
// Stop the impersonation.
_context.Undo();
_disposed = true;
}
}
}
试一试,让我知道你是怎么过的......
安德鲁
答案 1 :(得分:0)
您链接的示例适用于控制台应用程序。如果您有一个ASP.Net Web应用程序,您希望在访问者的安全上下文中执行代码,则可以在IIS身份验证设置中启用ASP.Net模拟(在IIS管理器MMC管理单元中)。
答案 2 :(得分:0)
为Users组提供对App_Data文件夹的写访问权限解决了该问题。不知道这与假冒有什么关系。