ASP.NET模拟问题(第2部分)

时间:2011-05-18 16:12:52

标签: asp.net asp.net-mvc-2 asp.net-mvc-3 impersonation windows-security

这是关于无法冒充当前登录的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授权规则 .NET Authorization Rules

验证 Authentication

一个问题,如果我禁用匿名身份验证,那么系统会提示我登录该站点。我想如果您使用域上的Active Directory帐户登录,那么此挑战不会出现?即使我在此提示中输入我的用户名/密码,我仍然无法进行模拟工作。

enter image description here

基本设置

Basic Settings

3 个答案:

答案 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)

我遇到了类似你描述的问题。问题的基本关键是假冒和授权之间存在差异。我对此的简单理解是,当客户端和服务器位于同一台机器上时,模拟将起作用。但是,如果客户端位于不同的计算机上,则需要委派。

MSDN Reference

  

模仿和委派之间有什么区别?

     

冒充流动原件   呼叫者对后端的身份   同一台计算机上的资源。   委托流动原始调用者   身份到后端资源   计算机以外的计算机   运行服务。

相关的SO问题

答案 2 :(得分:0)

您是否尝试过使用

HttpContext.Current.User.Identity.Name ?