HttpContext.Current.User.Identity.Name为空。

51

我有一个使用MVC框架的Silverlight应用程序,在Visual Studio中进行构建时,使用Visual Studio Development center没有问题,HttpContext.Current.User.Identity.Name返回了值。

但是当我在IIS 7.5上使用相同的项目(我正在使用Windows 7),HttpContext.Current.User.Identity.Name为空。

有人能提供帮助吗?或者知道我可以在哪里找到Visual Studio Development center的设置,以便我可以检查IIS中出了什么问题?


2
请检查您的身份验证设置。HttpContext.Current.User是一个IPrincipal,它包装了当前用户 - 无论是Windows用户、.NET Forms安全主体、Passport主体还是来自您自己项目的自定义用户主体。我怀疑IIS7允许匿名身份验证,而Visual Studio以经过身份验证的用户运行,原因不明。在Visual Studio中,.Name值返回什么?您的IIS站点的身份验证设置是什么? - Dylan Beattie
在Visual Studio中,.Name返回“lapjordy\Jordy”(我的Windows登录名)在IIS中,.Name返回“”(空字符串)我关闭了IIS中的匿名身份验证,并打开了Windows身份验证,但是浏览器要求我提供我的Windows凭据。我想要的唯一一件事是,应用程序(Silverlight)给出我的当前Windows用户的名称(而不需要浏览器询问我的用户名-->请参见图像)。 - Jordy
11个回答

58

我过去几天一直在解决这个问题。

我建议阅读 Scott Guthrie 的博客文章 Recipe: Enabling Windows Authentication within an Intranet ASP.NET Web application

对我来说,问题在于虽然我在 IIS 中启用了 Windows 身份验证并且在 web.config 的 system.web 部分中有 <authentication mode="Windows" />,但我没有防止匿名访问。这是关键点。您需要防止匿名访问以确保浏览器发送凭据。

您可以在控制面板中配置IIS,使您的站点(或计算机)使用Windows身份验证并拒绝匿名访问,或者可以在 web.config 的 system.web 部分中添加以下内容:

<authentication mode="Windows" />

<authorization>
   <deny users="?"/>
</authorization>

5
对我来说起作用了,尽管我的Identity.Name只有时不时地是空白的,在一瞬间内发生变化。不知道为什么,如果有人能解释一下,我会很感兴趣? - Ronnie
3
如果我在web.config中设置了这个,我就无法访问该页面了,会显示未授权,我正在使用Visual Studio。 - aero
你是在家庭网络还是带有Active Directory的工作网络上?我认为它只能与Active Directory(域)一起使用。在我的家庭网络中,我使用相同的配置也会出现未经授权的错误。 - Bryan Bedard

38

这些方法可能会解决问题(对我来说确实有效)。在IIS Express中更改项目属性值,“匿名身份验证”和“Windows身份验证”。选择项目后,按F4键,然后更改这些属性。

输入图片描述

如果您要在本地部署它,请确保本地计算机的“Windows身份验证”功能已启用,并且“匿名身份验证”已禁用。

请参考

https://grekai.wordpress.com/2011/03/31/httpcontext-current-user-identity-name-is-empty/


2
重点是“选择项目,按F4键”。这对我很有用。奇怪的是这在其他项目属性屏幕中没有。 - D. Kermott
兄弟,你救了我的一天。 - Mantra

8
除了“answered Mar 28 '11 at 12:27 Bryan Bedard”之外,
如果解决方案无效,您需要在iss管理器中启用Windows身份验证。
如何操作:
1.从运行对话框启动IIS管理器: 单击“开始”菜单,单击“附件”,然后单击“运行”。 在“打开”框中键入inetmgr,然后单击“确定”。
2.在连接窗格中,展开服务器名称,展开站点,并转到您要配置的层次结构窗格中的级别,然后单击Web站点或Web应用程序。 3.滚动到主页窗格中的IIS部分,然后双击“身份验证”。
4.在身份验证窗格中,选择匿名身份验证,然后单击禁用。 enter image description here 5.在身份验证窗格中,选择Windows身份验证,然后单击启用。 参考资料

如果你遇到了500.19错误,你可以尝试编辑applicationHost.config文件。使用ctrl+f查找windowsAuthentication并确保overrideModeDefault="Allow"。你可能需要对anonymousAuthentiction做同样的操作。这里有来自微软的更多信息。 - user875234

8
禁用iis身份验证选项卡中除了windows身份验证以外的所有选项解决了我的问题。请查看以下步骤:
1. 在计算机中打开iis。 2. 从应用程序池中选择你的应用程序。 3. 单击身份验证选项。 4. 禁用除了windows身份验证以外的所有选项(匿名身份验证应该被禁用)。
请按照以上步骤进行操作,希望这对你有帮助。如果您有任何反馈,请告诉我。这一方法对我有效,希望它也能对您有用。 enter image description here

7
我最近也遇到了这个问题。和新客户合作时,试图从Visual Studio通过IISExpress使用Windows身份验证来运行一个旧的Web Forms应用程序。 对我而言,web.config被正确配置了。
不过,IISExpress.config设置文件中有以下内容:
<windowsAuthentication enabled="false">

开发人员登录的用户帐户非常新,因此很可能没有被编辑过。 结果是很简单的修复,只需要将其更改为enabled=true,然后一切都正常运行了。


1
这就是我一直在寻找的答案。不过,我的IISExpress设置存储在applicationhost.config文件中。 - Nova

5
此外,特别是如果您是开发人员,请确保您连接的是IIS服务器而不是随Visual Studio一起提供的IIS Express。如果您正在调试项目,则有时认为您已连接到IIS时实际上并没有连接,这种情况同样容易甚至更容易发生。
即使您在IIS上启用了Windows身份验证并禁用了匿名身份验证,在Visual Studio模拟中也不会有任何区别。

2

如果 IIS 服务器位于同一域内并且组策略中的安全设置允许,浏览器才能检测到您的用户名。

否则,您将需要提供凭据,但如果它不在同一个域中,则无法对您进行身份验证。


2
你如何将IIS服务器和浏览器(或应用程序?)放在同一个域中?我需要在哪里设置这些组策略?你有例子吗?希望你能帮忙! :) - Jordy

1
除了之前提到的所有明显原因外,可能还有另一个原因:您没有在控制器顶部放置Authorize属性,如下所示:
[Authorize(Roles = "myRole")]
[EnableCors(origins: "http://localhost:8080", headers: "*", methods: "*", SupportsCredentials = true)]
public class MyController : ApiController

至少对我来说是有效的。

0
正如@PaulTheCyclist所说,如果使用IISExpress,则匿名身份验证默认启用,Windows身份验证被禁用。
这可以在以前称为PropertyPages(而不是右键单击->属性)的选项中更改。选择Web项目。

0
我在创建项目时没有设置身份验证模式,遇到了这个问题。 因此,在初始设置中将身份验证设置为 Windows 模式后,新建项目才能正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接