我成功地冒充了用户。使用LogonUser Interop,例如
[DllImport("advapi32.dll", SetLastError = true)]
static extern bool LogonUser(
string principal,
string authority,
string password,
LogonSessionType logonType,
LogonProvider logonProvider,
out IntPtr token);
这很好用。当我转到我的即时窗口并输入WindowsIdentity.GetCurrent().Name
时,模拟的用户显示为我的CurrentUser。当我发布这个用户时,它会回到我的真实用户身上。这里没问题 - 我我冒充。
但是,当我尝试将文件写入用户有权访问的共享时,我得到:
Access to the path [path name] denied.
。
我已经能够以我模仿,导航和将文件写入共享的用户手动登录Windows。用户肯定对我所定位的目录有管理权限。
我允许最终用户上传文件,并使用HttpPostedFileBase
对象将文件写入此共享。本质上,我正在限制模拟上传文件的代码块。一旦完成,它将返回到原始经过身份验证的LDAP用户,例如
imp = Impersonation.ImpersonateUser("someuser","somepassword");
HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase;
...
hpf.SaveAs(path);
Impersonation.StopImpersonating(imp);
路径正确。
当我使用SaveAs
方法保存文件时,是否尊重我的模仿?
是否尝试将文件写入我不知道的其他帐户?如果是这样,我该怎么改变呢?
似乎没有使用SaveAs
方法进行大量控制 - 而不是单个重载。是否有其他替代方法可以使用此对象来更好地控制我的凭据?
答案 0 :(得分:3)
这听起来像是一个双跳身份验证问题。您是否尝试过让网站共享修改访问您网站的默认IIS用户(例如ASPNET)并运行POST / SaveAs而不使用模拟代码?如果失败,您应该查看是否在IIS中设置了可能导致服务器跃点身份验证问题的事情。这可能是一个很好的起点:
答案 1 :(得分:0)
你说“写一个文件到这个共享。”共享有单独的权限,而不是计算机上的文件夹。你有没有检查过共享权限?
答案 2 :(得分:0)
尝试调整LogonSessionType值。我认为,为了保存到网络共享,您需要将其设置为“网络”,而默认为“交互式”。
更多详情:How To: Use Impersonation and Delegation in ASP.NET 2.0