HttpContext.Current.User.Identity.Name 为空

Posted

技术标签:

【中文标题】HttpContext.Current.User.Identity.Name 为空【英文标题】:HttpContext.Current.User.Identity.Name is Empty 【发布时间】:2009-10-15 08:29:05 【问题描述】:

我有一个 Silverlight 应用程序(使用 MVC),当我在 Visual Studio 中构建时,使用 Visual Studio 开发中心,没有问题,HttpContext.Current.User.Identity.Name 有一个值

但是当我使用 IIS 7.5 的同一个项目(我使用的是 Windows 7)时,HttpContext.Current.User.Identity.Name 保持为空

谁能帮忙?或者知道在哪里可以找到 Visual Studio 开发中心的设置,以便检查 IIS 中的问题?

【问题讨论】:

检查您的身份验证设置。 HttpContext.Current.User 是包装当前用户的 IPrincipal - 无论是 Windows 用户、.NET Forms 安全主体、Passport 主体还是您自己项目中的自定义用户主体。我怀疑 IIS7 允许匿名身份验证,而无论出于何种原因,Visual Studio 都以经过身份验证的用户身份运行。 Visual Studio 中返回的 .Name 值是什么,您的 IIS 站点上的身份验证设置是什么? .Name 在 Visual Studio 中返回“lapjordy\\Jordy”(我的 Windows 登录名)。在 IIS 中的名称返回“”(空字符串)我在 IIS 中关闭匿名身份验证并打开 Windows 身份验证,但随后浏览器要求我给我我的 Windows 凭据。我唯一想要的是应用程序(silverlight)给我当前 Windows 用户的名称(没有浏览器要求我的用户名 --> 参见图片) img98.imageshack.us/content.php?page=done&l=img98/5376/… 【参考方案1】:

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

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

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

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

<authentication mode="Windows" />

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

【讨论】:

为我工作虽然我的 Identity.Name 只是间歇性地空白,从一秒到一秒。不知道为什么,如果有人能解释一下,会有兴趣吗? 如果我在 web.config 中设置了这个,我不能再访问页面了,说未经授权,使用 Visual Studio 您是使用 Active Directory 的家庭网络还是工作网络?我认为它仅适用于 Active Directory(域)。在我的家庭网络上,使用相同的配置,我也会收到未经授权的错误。【参考方案2】:

这些可能会解决问题(它对我有用)。在 IIS Express 中更改项目属性值,“匿名身份验证”和“Windows 身份验证”。为此,在选择项目时,按 F4,然后更改这些属性。

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

参考

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

【讨论】:

强调“项目被选中,按F4”。那是为我做的。奇怪的是,这不在其他项目属性屏幕中。 你救了我的一天。【参考方案3】:

除了“Bryan Bedard 于 2011 年 3 月 28 日 12:27 回答”

如果解决方案不起作用,您必须在 iss manager 中启用 Windows 身份验证。 如何做到这一点:

1.从运行对话框启动 IIS 管理器: 在开始菜单上,单击所有程序,单击附件,然后单击运行。 在“打开”框中,键入 inetmgr,然后单击“确定”。

2.在“连接”窗格中,展开服务器名称,展开站点,然后转到层次结构窗格中要配置的级别,然后单击网站或 Web 应用程序。 3. 滚动到主页窗格中的 IIS 部分,然后双击身份验证。

4.在身份验证窗格中,选择匿名身份验证,然后单击禁用。

    在“身份验证”窗格中,选择“Windows 身份验证”,然后单击“启用”。

Reference

【讨论】:

另外,如果您得到 500.19,您可以尝试编辑 applicationHost.config。 ctrl+f windowsAuthentication 并确保overrideModeDefault="Allow"。您可能需要对 anonymousAuthentiction 执行相同的操作,Here 是来自 Microsoft 的更多信息。【参考方案4】:

禁用 iis 身份验证选项卡中的所有其他选项(Windows 身份验证除外)解决了我的问题。 请检查..

步骤:

    在您的机器中打开 iis 从应用程序池中选择您的应用程序 点击身份验证选项 禁用除 windows 身份验证以外的所有其他选项(应禁用匿名身份验证)

请检查并告诉我反馈。它对我有用。希望它也对你有用..

【讨论】:

【参考方案5】:

我最近也遇到了这个问题。使用新客户端,尝试通过使用 Windows 身份验证的 IISExpress 从 Visual Studio 运行旧的 Web 表单应用程序。 对我来说,web.config 配置正确

但是,IISExpress.config 设置文件有:

<windowsAuthentication enabled="false">

开发人员登录的用户帐户非常新,因此不太可能被编辑过。 结果很简单,把它改成 enabled=true 就可以正常运行了。

【讨论】:

这是我正在寻找的答案。不过,我的 IISExpress 设置存储在文件 applicationhost.config 中。【参考方案6】:

另外,特别是如果您是开发人员,请确保您实际上连接到 IIS 服务器,而不是连接到 Visual Studio 附带的 IIS Express。如果您正在调试一个项目,有时甚至认为您已连接到 IIS 也很容易,而实际上您并没有。

即使您在 IIS 上启用了 Windows 身份验证并禁用了匿名身份验证,这也不会对您的 Visual Studio 模拟产生任何影响。

【讨论】:

【参考方案7】:

仅当 IIS 服务器位于同一域中并且您的组策略中的安全设置允许时,浏览器才会检测您的用户名。

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

【讨论】:

如何将 IIS 服务器和浏览器(或应用程序?)放在同一个域中?我是否需要设置这些组策略?你有一个例子吗?希望你能帮忙! :)【参考方案8】:

除了前面提到的所有明显原因之外,可能还有另一个原因:您没有像这样在控制器顶部放置 Authorize 属性:

[Authorize(Roles = "myRole")]
[EnableCors(origins: "http://localhost:8080", headers: "*", methods: "*", SupportsCredentials = true)]
public class MyController : ApiController

至少这对我有用。

【讨论】:

【参考方案9】:

正如@PaulTheCyclist 所说,如果默认启用 IISExpress 匿名身份验证,则会禁用 Windows 身份验证。

这可以在我确定以前称为 PropertyPages 的内容中进行更改(不是右键单击 -> 属性)。选择网络项目

【讨论】:

【参考方案10】:

尝试在 IIS 中启用基本身份验证并禁用其他身份验证,然后尝试启动应用程序。该应用程序将要求提供 Windows 凭据。输入相同的,应用程序应该能够获取 HttpContext.Current.User.Identity.Name 下的名称。

【讨论】:

【参考方案11】:

我在创建项目时未设置身份验证模式时遇到了这个问题。 因此,在初始设置中将身份验证设置为 windows 模式创建新项目时,它可以工作。

【讨论】:

以上是关于HttpContext.Current.User.Identity.Name 为空的主要内容,如果未能解决你的问题,请参考以下文章

HttpContext.Current.User.Identity.Name 为空

HttpContext.Current.User.Identity.Name 每次都是空的

将 HttpContext.Current.User 与异步等待一起使用的正确方法

HttpContext.Current.User.Identity.Name为Empty

ASP.NET C#中怎么让 httpcontext.current.user.identity.name 获取为自定义的值

WindowsIdentity winId = (WindowsIdentity)HttpContext.Current.User.Identity;如何使这个演员工作;目前它失败了