【问题标题】:WindowsIdentity and Classic .Net App PoolWindowsIdentity 和经典 .Net 应用程序池
【发布时间】:2012-09-20 16:02:53
【问题描述】:

我有一个 ASP.NET 网站,要求我的应用程序池是经典 .Net 应用程序池。该站点在 IIS 7 上的 .NET 3.5 上运行。当我尝试获取登录用户的 Active Directory 用户名时:

System.Security.Principal.WindowsIdentity.GetCurrent().Name

我得到以下信息:

IIS APPPOOL\\Classic .NET AppPool   

但是,当我将应用程序池设置为 .net 4.0 时,它会返回登录的用户名(这是我想要的)。我错过了一个设置吗?

【问题讨论】:

  • 您在代码中的哪个位置使用 ActiveDirectory 我在这里看不到任何地方表明您正在使用 AD.. 您熟悉 AD..吗?如果您使用的是网页,那么您返回的内容是正确的,那么 Page.User.Identity.Name.Split("\") 应该返回数组 pos 0 中的域和数组 pos 1 中的用户,所以我有点困惑你想做什么
  • 这是一个内部站点。当用户请求页面时,我正在使用 System.Security.Principal.WindowsIdentity 检查他们的身份......当我调试(未附加到 IIS)时,我得到了预期的域/用户名,但是当我将 VS 2010 绑定到 IIS 时对于调试,它返回“IIS APPPOOL\\Classic .NET AppPool”
  • 您是否尝试在 web.config 文件中明确设置 <identity impersonate="true" />??
  • 是的——但这会模拟 IIS 中为网站设置的身份。这不会返回登录用户的身份。

标签: c# asp.net iis-7


【解决方案1】:

首先将这行放在 web.config 配置部分中:

<authentication mode="Windows"/>
<authorization>
  <deny users="?"/>
</authorization>
<identity impersonate="true"/>

第二次转到 IIS 管理器打开您的 Web 应用程序属性并检查以下身份验证设置:

匿名身份验证 = 已禁用, ASP.NET Impersonation = 已启用(这不是必需的), Windows 身份验证 = 已启用

此设置将为您提供 Active Directory 用户并模拟它。

【讨论】:

    【解决方案2】:

    如果使用相同的代码并且它在一个应用程序池中运行而不是在另一个应用程序池中运行,我会检查应用程序池的设置。查找 Identity 属性。我想,在 .NET 4.0 池下,您将拥有 ApplicationPoolIdentity,在 3.5 下,您将拥有一个硬编码帐户。

    编辑

    所以听起来您并没有真正获得用户凭据。当然,当您在本地运行时,您会获得域帐户......该过程在您的凭据下运行。但是当您在另一台机器上运行时,它会在处理请求的帐户的凭据下运行......直到您告诉它模拟用户。即使这样,您也可能必须为站点设置 Windows 身份验证以获取凭据,或使用带有 AD 挂钩的表单身份验证来获取当前用户帐户下的所有内容。

    【讨论】:

    • 3.5下可以设置身份为LocalService、LocalSystem、NetworkServer和ApplicationPoolIdentity。每个都返回一个与该设置关联的身份(例如“NT AUTHORITY\\LOCAL SERVICE”)
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2010-12-09
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多