【问题标题】:wrong user/password didn't checked at ADAD 未检查错误的用户/密码
【发布时间】:2016-07-11 11:54:49
【问题描述】:

我创建了一个带有 Windows 身份验证的 MVC 5 应用程序,

<authentication mode="Windows" />
<authorization>
  <deny users="?" />
</authorization>

我有下面的代码来获取用户的显示名称以及我还想做验证,

protected void Session_Start(object sender, EventArgs e)
    {

        if (Context.User != null)
        {
            MapUserADDetails(Context.User);
        }
    }

    private void MapUserADDetails(IPrincipal user)
    {

        using (HostingEnvironment.Impersonate())
        using (var domain = new PrincipalContext(ContextType.Domain, "test.com"))
        using (var usr = UserPrincipal.FindByIdentity(domain, user.Identity.Name))
        {
            if (usr == null)
            {
                return;
            }

            Session.Add("UserDisplayName", usr.DisplayName);
        }
    }

现在我将这个应用程序托管到 IIS 上,并且只启用了 Windows 身份验证。当我浏览它时,它会提示输入用户名和密码,

问题

即使我输入了错误的用户名/密码,甚至没有填写任何内容,它也能获取显示名称。

如何限制这个?用户/通行证必须针对 AD 进行验证。请建议。谢谢!

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5 active-directory


    【解决方案1】:

    这听起来是 IIS 配置问题,而不是代码。

    解决问题:

    • 检查 IE 的行为是否不同
    • 确保 IIS 仅启用了 Windows 身份验证,而不是例如匿名(见Receiving login prompt using integrated windows authentication
    • 确保页面没有从其他需要身份验证的位置使用的其他资源(例如图像)(可能提示不是针对页面,而是针对嵌入其中的资源)
    • 检查浏览器设置(例如,在 IE 中,该站点可能需要添加到 Intranet 区域,或者“使用当前用户名和密码自动登录”未启用)

    【讨论】:

      【解决方案2】:

      您实际上并未验证任何用户名/密码组合。 UserPrincipal.FindByIdentity 只检查用户是否在 AD 中。

      要验证用户凭据,您需要检查:

      using (var domain = new PrincipalContext(ContextType.Domain, "test.com"))
      {
          bool authenticated = domain.ValidateCredentials(user.Identity.Name, password);
          if (!authenticated)
          {
              // Do stuff
          }
      }
      

      您可以查看MSDN了解更多信息。

      【讨论】:

      • 谢谢,但请告诉我如何传递密码,因为我们没有登录屏幕,而且我正在使用 Windows 身份验证。
      • 听起来你将无法让它工作。我看不到如何在没有密码的情况下验证用户帐户。简单地验证用户是否存在,对我来说听起来像是一个安全风险,但这是你做出的选择。如果您想在 IIS 中使用 Windows 身份验证,则需要确保 Internet 选项中的安全设置设置正确。
      • 啊,现在我明白了:您想绕过登录并重新使用当前从 Windows 登录的用户。在这种情况下,您不必再针对 AD 进行验证,因为 Windows 已经为您完成了这项工作。确保您的站点列在 Internet 选项控制面板的 Intranet(或本地 Intranet)站点列表中。然后你可以检查User.Identity.IsAuthenticated而不用密码验证。
      猜你喜欢
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 2011-01-03
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多