2

根据这份文件:

http://msdn.microsoft.com/en-us/library/ff647405.aspx

我在 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

我已经放弃了。模拟不起作用,我只能假设它是网络策略或一些无法发现的隐藏设置。

4

1 回答 1

2

知道了。有点。

string n1 = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
string n2 = System.Threading.Thread.CurrentPrincipal.Identity.Name;

n1 = 进程标识 n2 = 调用者的标识

线程的安全上下文有调用者的身份,这是我没想到的。我认为线程会有流程的上下文流向它,但这显然不是它的工作方式。

我现在有一个有趣的情况,当我在呼叫者 WindowsIdentity 上调用 .Impersonate 时,我仍然无法访问呼叫帐户许可的本地文件,但我会解决这个问题并更新我的答案。

查看有问题的更新

于 2012-07-24T15:11:09.293 回答