这是关于无法冒充当前登录的Windows用户的上一篇文章的后续内容。有很多好的建议,但之前的主题变得混乱,所以我正在重置这篇文章。希望在下面记录的当前状态下,问题显而易见。这是一条很好的路径,所以我不得不相信我所缺少的只是一个配置步骤。
问题:我需要让ASP.NET模拟当前登录的用户。当我在IIS 7.5下运行时,它不起作用。 IIS Express工作正常,但我认为这是因为调试会话在我的用户ID下运行。
我正在使用Environment.Username
来确定此用户是谁。有人建议此属性始终返回登录的用户名,但在我的测试中,它会从IIS返回模拟用户。
例如,如果我的web.config有......
<identity impersonate="true" />
当我使用该设置在IIS 7.5下运行时,Environment.Username
会返回 IUSR 。我相信这是IIS匿名用户帐户。
如果我将web.config更改为...
<identity impersonate="true" userName="domain\jlivermore" password="mypassword" />
...然后Environment.Username返回jlivemore。但是,如果没有我在web.config中明确设置它,我需要它返回jlivermore。
以下是我的IIS设置......
.NET授权规则
验证
一个问题,如果我禁用匿名身份验证,那么系统会提示我登录该站点。我想如果您使用域上的Active Directory帐户登录,那么此挑战不会出现?即使我在此提示中输入我的用户名/密码,我仍然无法进行模拟工作。
基本设置
答案 0 :(得分:2)
我不确定您是否找到了答案,但如果有人遇到问题,您需要在web.config文件中添加以下内容
<authentication mode="Windows"/>
<identity impersonate="true"/>
在IIS中,您需要启用Asp.net Impersonation以及启用Windows身份验证,其他应该被禁用。在Windows身份验证中,转到“高级设置”并取消选中“启用内核模式”身份验证。应该这样做。现在应该为本地Intranet应用程序设置您的站点,并使用以下任何一种方法
System.Security.Principal.WindowsIdentity.GetCurrent().Username()
HttpContext.Current.User.Identity.Name
System.Threading.Thread.CurrentPrincipal.Identity.Name
但是使用Environment.Username只会返回服务器名称,希望这有助于任何人在努力解决这个问题
答案 1 :(得分:1)
我遇到了类似你描述的问题。问题的基本关键是假冒和授权之间存在差异。我对此的简单理解是,当客户端和服务器位于同一台机器上时,模拟将起作用。但是,如果客户端位于不同的计算机上,则需要委派。
模仿和委派之间有什么区别?
冒充流动原件 呼叫者对后端的身份 同一台计算机上的资源。 委托流动原始调用者 身份到后端资源 计算机以外的计算机 运行服务。
相关的SO问题
答案 2 :(得分:0)
您是否尝试过使用
HttpContext.Current.User.Identity.Name ?