【问题标题】:User.Identity.Name blank in ASP.Net MVCASP.Net MVC 中的 User.Identity.Name 空白
【发布时间】:2016-06-05 13:38:39
【问题描述】:

完全按照标题。

只需在我的 HomeController 我有:

string Username = User.Identity.Name;

为什么这个值总是空白?

我必须在 web.config 中放置什么特别的东西才能使这个值通过。我在 VS dev web 服务器和 windows server 2003 IIS 服务器上都试过了。

它必须是一些简单的东西,IIS 中的服务器设置或代码非常简单并且似乎是引用此值的正确方法。

非常感谢

【问题讨论】:

  • 嗯哇,伙计们。超级快速的反应。非常感谢.. 我想要一个无缝的身份验证,即集成样式,例如在 ASP.Net Web 表单或经典 ASP 中,您可以从企业环境中获取 Windows 用户名。例如。 "MYDOMAN\j_smith" 等等。那么我可以从每个页面中获取这个值而不需要在每个方法中添加 Authorize 吗?再次感谢。

标签: asp.net-mvc iis


【解决方案1】:

如果您想使用 Windows 身份验证,仅添加是不够的

...
 <system.web>
  ...
  <authentication mode="Windows"/>
  ...
 </system.web>
 ...

您还需要查看 MVC 项目的自述文件说明,尤其是当您在 IIS Express 中运行并使用 Visual Studio 2012 时。

见下文:

在 IIS Express 上托管:

  1. 在解决方案资源管理器中单击您的项目以选择该项目。

  2. 如果“属性”窗格未打开,请将其打开 (F4)。

  3. 在项目的“属性”窗格中:
    a) 将“匿名身份验证”设置为“禁用”。
    b) 将“Windows 身份验证”设置为 “启用”。

在 IIS 7 或更高版本上托管:

  1. 打开 IIS 管理器并导航到您的网站。

  2. 在功能视图中,双击身份验证。

  3. 在身份验证页面上,选择 Windows 身份验证。如果 Windows 身份验证不是一个选项,您需要确保 服务器上安装了 Windows 身份验证。

    在 Windows 上启用 Windows 身份验证:

a) 在控制面板中打开“程序和功能”。 b) 选择“打开或关闭 Windows 功能”。

c) 导航到 Internet 信息服务 > 万维网服务 > 安全 并确保选中 Windows 身份验证节点。

在 Windows Server 上启用 Windows 身份验证:

a) 在服务器管理器中,选择 Web 服务器 (IIS) 并单击添加角色服务。

b) 导航到 Web 服务器 > 安全 并确保选中 Windows 身份验证节点。

  1. 在“操作”窗格中,单击启用以使用 Windows 身份验证。

  2. 在身份验证页面上,选择匿名身份验证。

  3. 在“操作”窗格中,单击禁用以禁用匿名身份验证。

【讨论】:

    【解决方案2】:

    当然是伙计。您需要通过网站进行身份验证。这是用于身份验证的名称。

    你正在验证,对吧?

    这不是设置等等。

    如果您使用的是标准 ASP.NET MVC 模板(如果我没记错的话),请单击登录链接。

    更新(因为张贴添加了更多信息/cmets)

    因此,您所追求的是 Windows 身份验证。 A quick google search 想出了this post。这很有帮助(虽然有点旧,但仍然相关).. 看看。

    找到a better post,带有用于 Windows 身份验证的 MVC 代码。请检查一下。

    重要的配置设置是...

    ...
     <system.web>
      ...
      <authentication mode="Windows"/>
      ...
     </system.web>
     ...
    

    【讨论】:

    • 谢谢伙计。这很棒,但我只想无缝地做到这一点。用户没有点击或登录表单。这是一个企业网络应用程序。这家公司的每个人都应该能够查看这个网络应用程序的所有页面,但让我自动获取他们的 Windows 用户名。在 ASP.Net 网络表单、经典 ASP 等中仅使用一个衬里就超级简单。只要您在 IIS 中设置了集成身份验证,您就可以获取该值。再次感谢。
    • BAM 我们在做生意。对你好,干杯。帮助我更好地理解 MVC 处理 User.Identity 的方式。 IE。您可以通过任何一种形式或通过“窗口”进行“身份验证”,无论您选择哪种方式,都将在该对象中拥有所需的信息。太棒了,干杯。
    • 找到了一个包含相关信息的更好的帖子。查看上面的链接。 (我已经更新了帖子,第二次)。
    • 伟大的,ta。好的,在我的 VS 开发 Web 服务器上运行良好。然后应用程序发布到开发 Web 服务器,但该值再次为空。我在站点上的 IIS 中打开了集成身份验证,它实际上是一个虚拟目录。 IE。 MyDevServer/MyApp 缺少哪个设置?再次感谢。
    • @Aaron-User.Identity 在 ASP.NET Web 表单和 ASP.NET MVC 中的工作方式相同。
    【解决方案3】:

    如果您不想在每个控制器或操作上授权,您可以在 web.config 文件中进行全面授权。只要您使用 Windows 身份验证,这应该可以工作。如果您允许 ASP.NET 控制身份验证,则无需配置任何 IIS 设置。然后,它应该可以与您正在运行的任何 Web 服务器一起正常工作。我不知道或假设你到目前为止已经尝试过什么,我会尽量完整地回答我的问题。首先注释掉 web.config 中的表单身份验证标签。以下所有设置都放在 system.web 配置部分。

    <!--
        <authentication mode="Forms">
          <forms loginUrl="~/Account/LogOn" timeout="2880" />
        </authentication>
    -->
    

    替换为 Windows 身份验证标记。

    <authentication mode="Windows" />
    

    然后添加授权标签,拒绝匿名用户访问。如果用户使用 Internet Explorer 并从 Intranet 区域连接,IE 将自动登录用户。但是如果用户从 Internet 区域连接,IE 仍然会显示一个登录框,但为了安全起见。但这些是可以从 IE 中设置的选项。

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

    在未经授权的情况下设置单独身份验证模式不会强制用户在 ASP.NET 中进行身份验证。如果你想控制 IIS 的安全性,我对 IIS 设置帮助不大,但我知道基本上你可以禁用 Basic Authentication ,然后启用 Integrated Windows Authentication ,然后禁用匿名登录帐户,这将达到相同或更好的结果。

    我目前也在做一个 MVC 项目,我用我的项目测试了上述设置,它可以工作。您不需要 Authorize 属性,因为我们在配置中有 authorization 标记。我希望这对您有所帮助,而不是得到另一个-1。

    【讨论】:

    • 我们走了 :) 一个很好的答案,TomatoGG :) 看!我们都可以相处得很好。
    【解决方案4】:

    您是否已将 Authorize 属性附加到您的操作或控制器?

    public class HomeController : Controller {
        [Authorize]
        public ActionResult Index() {
             string userName = User.Identity.Name;
             return View();
        }
    }
    

    【讨论】:

    • 该属性仅意味着该方法(它附加到)需要用户获得授权,然后才能运行任何逻辑。与 User.Identity.Name 的值为空无关。
    • 谢谢堆,请看我上面的评论番茄。刚刚按照你的建议添加了这个。然后我在该页面上出现了一个身份验证 Web 表单。所以它让用户需要进行身份验证,但我想无缝地做到这一点,即我们公司环境/局域网内的每个人都可以看到这个网站上的每个页面,但我公开验证他们,但我可以获取他们的用户名。那么我可以基本上将身份验证方法从表单更改为“集成”,然后允许访问所有内容吗?再次感谢。
    • 出现认证web表单是因为MVC项目中认证方式设置为Forms认证。您需要在 web.config 文件中将模式设置为 Windows 身份验证。更改会比在 IIS 中进行更改要简单得多。
    • Pure.Krome 很遗憾,您贬低了我的答案,而不是您必须编辑几次才能使其正确的不完整答案。至少我的回答完成了工作。通过使用该属性,我强制用户进行身份验证,因此该名称将可用。那么在什么意义上我应该得到-1?如果我知道我会被欺负,我会费心回答。适合我尝试提供帮助。
    • 不,感谢您的帮助 Tomato,请继续做您正在做的事情。我猜是因为积分系统,这里有点竞争。您的帮助很棒,我也了解了授权标签,这是一个附带好处。
    猜你喜欢
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2023-04-03
    相关资源
    最近更新 更多