根据这份文件:
我在 web.config 中设置了以下内容
<authentication mode="Windows" />
<identity impersonate="false" />
并且还在 IIS Express 7.5 的 applicationhost.config 中进行了设置
<anonymousAuthentication enabled="false" userName="" />
<windowsAuthentication enabled="true">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
但是 System.Threading.Thread.CurrentPrincipal.Identity 仍然始终等于经过身份验证的用户的 Windows 身份,即不是运行 IISExpress.exe 的帐户(我的开发帐户)。
需要明确的是,我以帐户 A 登录,IIS Express 作为帐户 A 运行,但我使用帐户 B 调用我的 Web 服务(在 HttpWebRequest 上设置凭据),但服务器端代码作为帐户 B 运行,即线程有这个ID,我可以访问网络资源。
我希望以帐户 A 的身份执行(在产品服务器上,作为服务帐户),并且仅在我想要的时候模拟。
我做错了什么还是这个领域在 IISX 中没有完美实现?
谢谢
卢克
更新 1
所以,我想我知道发生了什么;请参阅下面的答案。问题是它似乎在反向工作!
string n1 = System.Security.Principal.WindowsIdentity.GetCurrent().Name; // Runtime account.
string n2 = System.Threading.Thread.CurrentPrincipal.Identity.Name; // Calling account.
var winId = (System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity;
System.Security.Principal.WindowsImpersonationContext ctx = null;
try
{
bool b = System.IO.File.Exists(@"d:\p\p.txt"); // true (!)
using (ctx = winId.Impersonate())
{
// Now impersonating. Access (local) resources using the identity of the authenticated user.
n1 = System.Security.Principal.WindowsIdentity.GetCurrent().Name; // Calling account.
n2 = System.Threading.Thread.CurrentPrincipal.Identity.Name; // Calling account.
b = System.IO.File.Exists(@"d:\p\p.txt"); // false (!)
}
...
文件夹 d:\p 设置为仅允许调用帐户访问,这在 DOS 中测试时很好,但从我的 Web 服务,它可以访问,我希望这是因为线程具有调用者的安全上下文,在我之前开始冒充了!
更奇怪的是,当我冒充时,我突然无法访问它!
我将在适当的 IIS 7.5 服务器上创建一个测试项目,看看这是否是 IIS Express 中的错误。
更新 2
Exists 测试的问题已经解决了一半。我删除了对该文件夹的权限,但文件本身仍然具有一些权限,并且 .NET 在不遍历文件夹的情况下访问文件的方式意味着它仍然可以访问它。
现在我明白了
b == false // as expected.
...
b == false // unexpected, after impersonation I should be able to see this file.
我希望冒充可以让我访问,但事实并非如此。
更新 3
我已经放弃了。模拟不起作用,我只能假设它是网络策略或一些无法发现的隐藏设置。