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

Posted

技术标签:

【中文标题】在 VS2013 中调试时的身份验证问题 - iis express【英文标题】:Authentication issue when debugging in VS2013 - iis express 【发布时间】:2013-10-31 04:57:27 【问题描述】:

我在 Visual Studio 2013 中调试时尝试获取 windows 用户名。我只是在使用:

httpcontext.current.user.identity.name

如果我在我的开发服务器上运行它可以正常工作,如果我在任何以前版本的 Visual Studio 上以调试模式运行它也可以正常工作。

我的问题是 - 如果我在 Visual Studio 2013 上运行它,我会得到一个空字符串。

我的网络配置如下。

<system.web>
    <authentication mode="Windows"/>
    <identity impersonate="false"/>
    <authorization>
       <allow users="*"/>
    </authorization>
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.0"/>
    <customErrors mode="Off"/>
</system.web>

【问题讨论】:

【参考方案1】:

F4 并不总是将我带到这个面板。此外,人们常说,一张图抵得上一千个字。

【讨论】:

【参考方案2】:

当我研究这个时,我找到了我的答案,但在互联网上找不到答案,所以我想我会分享这个:

我通过修改我的 applicationhost.config 文件解决了我的问题。我的文件保存在“\My Documents\IISExpress\config”文件夹中。

VS2013 似乎忽略了我的 web.config 文件并应用了不同的身份验证方法。

我不得不修改这部分文件,使其如下所示。其实我只是修改了anonymousAuthentication为false,windowsAuthentication模式为true。

<authentication>

  <anonymousAuthentication enabled="false" userName="" />

  <basicAuthentication enabled="false" />

  <clientCertificateMappingAuthentication enabled="false" />

  <digestAuthentication enabled="false" />

  <iisClientCertificateMappingAuthentication enabled="false">
  </iisClientCertificateMappingAuthentication>

  <windowsAuthentication enabled="true">
    <providers>
      <add value="Negotiate" />
      <add value="NTLM" />
    </providers>
  </windowsAuthentication>

</authentication>

【讨论】:

我必须这样做才能在 VS2013 中使用 IIS Express 进行调试才能可靠地工作。没有这个,似乎可以正常工作一次,然后是 401。 (1) 是否有一个 AppCmd 命令可以更改 applicationhost.config 文件,以及 (2),Web 项目上的 F4 让我可以关闭匿名身份验证并打开 Windows 身份验证。在 VS2012 中这样做效果很好,在 VS2013 中不会产生 401 免费开发环境。 @Neil,你拯救了我的一天。 BTW:没有必要关闭anonymousAuthentication。打开windowsAuthentication就足够了。这些设置控制允许网站使用哪些身份验证机制。 +1 以及...一直试图用我当地的 IISExpress 解决这个烦人的问题一段时间 啊,就是这样。天才。感谢您的提示,非常有用! 我必须删除“协商”才能测试 Web 服务调用(使用 WSE3)而不会收到 401。【参考方案3】:

在 Visual Studio 2013 和 VS15 中(但我猜其他版本是否相同)只需按 F4 并更改这两个属性: -匿名身份验证: 禁用 -Windows 身份验证: 启用

【讨论】:

谢谢你。我不敢相信他们已经将其添加为“增强”。这就是 web.config 的用途。现在我们不能相信我们在 web.config 中看到的内容。太棒了。 你刚刚让我免于回滚到 Visual Studio 2010! 不敢相信这不是所有这些 SO 帖子中的第一个问题/答案,这些帖子一直在谈论 IIS 设置【参考方案4】:

VS 2015 改变了这一点。它在我的 Web 项目中添加了一个 .vs 文件夹,并且 applicationhost.config 就在其中。我进行了建议的更改(窗口身份验证 = true,anon = false),它开始提供用户名而不是空白。

【讨论】:

【参考方案5】:

上面的user3149240似乎提供了正确的答案。然而,正如 Neil Watson 指出的那样,applicationhost.config 文件在这里发挥了作用。

实际上可以在 VS 属性窗格或文件中进行更改,尽管在不同的位置。靠近 applicationhost.config 文件底部的是一组位置元素。 IIS Express 的每个应用程序似乎都有其中之一。更改 UI 中的设置会更新文件的这一部分。因此,您可以通过 UI 更改设置或修改此文件。

这是一个关闭匿名身份验证并打开 Windows 身份验证的示例:

<location path="MyApp">
    <system.webServer>
        <security>
            <authentication>
                <windowsAuthentication enabled="true" />
                <anonymousAuthentication enabled="false" />
            </authentication>
        </security>
    </system.webServer>
</location>

这在 VS UI 中相当于:

Anonymous Authentication: Disabled
Windows Authentication: Enabled

【讨论】:

在当前的VS中这不起作用,它总是说它已被锁定,即使在用户文档和解决方案.vs/config路径中的applicationhost.config模块都已解锁。此外,这不是唯一的地方,属性窗口中的设置实际上存储在 VS Web 项目的 XML 中。但这没关系,因为更改它们也无济于事,应用程序主机总是覆盖。需要注销才能使这些更改生效,仅此而已。【参考方案6】:

您还可以修改 Web 项目的项目属性,从左侧选项卡中选择“Web”,然后将“服务器”下拉菜单更改为“本地 IIS”。创建一个新的虚拟目录并使用 IIS 管理器根据需要设置您的站点/应用程序池。

我更喜欢这种方法,因为您通常会有一个本地 IIS v 目录(或站点)来进行本地测试。您也不会以这种方式影响任何其他网站。

【讨论】:

【参考方案7】:

我刚刚从 VS 2012 升级到 VS 2013,当前的用户身份 (HttpContext.User.Identity) 是匿名的。

我尝试更改 IIS express applicationhost.config,没有区别。

解决方案是查看 Web 项目的属性,当您选择项目的顶层时,按 F4 以获取项目属性。不要右键单击项目并选择属性,这是完全不同的。

将匿名身份验证更改为禁用并启用 Windows 身份验证。

像肉汁一样工作:)

【讨论】:

谢谢你。我不敢相信他们已经将其添加为“增强”。这就是 web.config 的用途。现在我们不能相信我们在 web.config 中看到的内容。太棒了。 我相信这比公认的答案更好,因为它不会影响在 IIS Express 上运行的其他应用程序。 非常感谢。这也为我做了!是我升级到 Visual Studio 2013 的 Visual Studio 2008 项目。 在 VS 2012 中,我使用了:“使用 Visual Studio 开发服务器”。所以升级,这有效。即使它现在运行 IIS Express。 如果您刚刚升级到 VS 2013,这应该是公认的答案。【参考方案8】:

在你的项目中在VS2013 F4中查看属性窗口并禁用匿名访问并启用“Windows身份验证”

然后它将起作用。无需更改任何其他内容

【讨论】:

令人沮丧的是,当您想要调试 Web 项目时,此选项存在,但对于服务项目不存在。呜呜呜……【参考方案9】:

打开位于 C:\Users[userid]\Documents\IISExpress\config 文件夹中的 applicationHost.config 文件。在此文件中,将 anonymousAthentication 和 windowsAuthentication 的 overrideModeDefault 更改为“Allow”

 <sectionGroup name="security">
                <section name="access" overrideModeDefault="Deny" />
                <section name="applicationDependencies" overrideModeDefault="Deny" />
                <sectionGroup name="authentication">
                    <section name="anonymousAuthentication" overrideModeDefault="Allow" />
                    <section name="basicAuthentication" overrideModeDefault="Deny" />
                    <section name="clientCertificateMappingAuthentication" overrideModeDefault="Deny" />
                    <section name="digestAuthentication" overrideModeDefault="Deny" />
                    <section name="iisClientCertificateMappingAuthentication" overrideModeDefault="Deny" />
                    <section name="windowsAuthentication" overrideModeDefault="Allow" />
                </sectionGroup>

接下来将 AnonymousAuthenticationModule 和 WindowsAuthenticationModule 的 lockItem 更改为“false”

  <system.webServer>
            <modules>
                <!--
                <add name="HttpCacheModule" lockItem="true" />
-->
                <add name="DynamicCompressionModule" lockItem="true" />
                <add name="StaticCompressionModule" lockItem="true" />
                <add name="DefaultDocumentModule" lockItem="true" />
                <add name="DirectoryListingModule" lockItem="true" />
                <add name="IsapiFilterModule" lockItem="true" />
                <add name="ProtocolSupportModule" lockItem="true" />
                <add name="HttpRedirectionModule" lockItem="true" />
                <add name="ServerSideIncludeModule" lockItem="true" />
                <add name="StaticFileModule" lockItem="true" />
                <add name="AnonymousAuthenticationModule" lockItem="false" />
                <add name="CertificateMappingAuthenticationModule" lockItem="true" />
                <add name="UrlAuthorizationModule" lockItem="true" />
                <add name="BasicAuthenticationModule" lockItem="true" />
                <add name="WindowsAuthenticationModule" lockItem="false" />

进行这些更改将允许现有的 Web 配置设置覆盖 IIS Express 的 applicationHost 文件中的内容。

【讨论】:

这些更改加上注销对我有用。某些东西被缓存了,因为从通知图标停止 IIS Express 并重新启动 VS 不起作用。这个错误真的很烦人,它每隔几个月或半年就会在构建新的 VM 或开发人员 PC 时发生。它总是会导致最多半天的时间丢失,弄乱设置。问题是虽然这些设置应该立即修复它,但它并没有,并且在玩过它之后突然起作用,非常奇怪,我不喜欢那样。然后建议注销。下次发生这种情况时,我会尝试隔离,但这是一个非常烦人的默认设置。

以上是关于在 VS2013 中调试时的身份验证问题 - iis express的主要内容,如果未能解决你的问题,请参考以下文章

使用vs远程调试iis站点

具有 Windows 身份验证 NTLM 的 IIS 10 上的 AEM Dispatcher - 启用 Dispatcher 缓存时的身份验证问题

VS2013无法启动IIS调试,被拒绝访问

vs远程调试iis

如何为 Intranet 预编译 MVC?

关于VS2013调试IIS应用源代码时无法进入断点的问题总结