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;如何使这个演员工作;目前它失败了