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 中经过身份验证?