IIS Express - 临时模拟经过身份验证的用户

Posted

技术标签:

【中文标题】IIS Express - 临时模拟经过身份验证的用户【英文标题】:IIS Express - temporarily impersonate the authenticated user 【发布时间】:2012-07-24 13:12:53 【问题描述】:

根据本文档:

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

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

【问题讨论】:

该 MSDN 文档适用于旧版本的 IIS。您是否按照以下步骤操作:technet.microsoft.com/en-us/library/cc730708(v=ws.10)? 有趣的是,原始文档建议我应该禁用模拟,这是有道理的,因为我只需要调用者的 Windows Id,这样我就可以在需要时使用它调用 Impersonate。 在我几年前写的另一个 ASMX 服务中,我设置了 impersonation = true 并提供了一些服务帐户凭据,这让我想知道我当时是否遇到了同样的问题! 【参考方案1】:

知道了。有点像。

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

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

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

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

查看问题更新

【讨论】:

以上是关于IIS Express - 临时模拟经过身份验证的用户的主要内容,如果未能解决你的问题,请参考以下文章

IIS Developer Express 上的 WCF 4 Rest 服务,身份验证问题

JetBrain Rider,使用带有 Windows 身份验证的 IIS Express 时访问被拒绝

在 VS2013 中调试时的身份验证问题 - iis express

如何检查用户是不是在 Firebase 和 Express/Node.js 中经过身份验证?

如何使用基于 JWT 令牌的 express 获取经过身份验证的用户信息

使用 IIS7、WCF Rest、自定义身份验证模块进行模拟