Windows身份验证和本地数据库用户身份验证

时间:2020-06-05 13:43:44

标签: c# asp.net-mvc iis active-directory windows-authentication

我在MVC应用程序中使用Windows身份验证模拟功能。当我打开该应用程序时,浏览器会显示提示输入凭据并验证域用户的信息。

但是现在我也想在我的应用程序中创建用户,并且还想对存储在我的数据库中的用户进行身份验证。

是否可以通过域用户的Windows身份验证来验证Application DB用户。我为此做了很多研发,但是还没有找到任何解决方案。感谢您的建议。谢谢!

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,则希望同时允许Windows身份验证和窗体身份验证。这不是一件普通的事情,但是我已经做到了。这是我的操作方式:

您必须使用表单身份验证作为主要身份验证。因此,您可以像往常一样构建表单身份验证:您有一个登录页面,提交后,该页面将验证数据库中的凭据。棘手的部分是添加Windows身份验证。

为此,请在使用Windows身份验证的身份验证控制器中创建一个操作。对于此示例,我假设您的控制器为AuthController,我们将其称为操作WinLogin。该动作将如下所示:

[Authorize]
public ActionResult WinLogin() {
    var principal = HttpContext.User;
    if (principal == null || !principal.Identity.IsAuthenticated) {
        //Windows authentication failed
        return new HttpUnauthorizedResult();
    }

    // User is validated, so create the form authentication cookie
    FormsAuthentication.SetAuthCookie(principal.Identity.Name, false);

    return new EmptyResult();
}

它仅检查用户是否已通过验证,如果通过验证,则使用其AD用户名设置表单身份验证cookie。

为此,要使用Windows身份验证,必须更新web.config,使其仅对一项操作使用Windows身份验证。您可以使用<location>标签来实现:

<location path="Auth/WinLogin">
    <system.webServer>
      <security>
        <authentication>
          <windowsAuthentication enabled="true" />
          <anonymousAuthentication enabled="false" />
        </authentication>
      </security>
    </system.webServer>
    <system.web>
      <authorization>
        <allow users="?" />
      </authorization>
    </system.web>
</location>

默认情况下,IIS不允许您在配置中的此位置更改身份验证方法。您需要在IIS管理器中更新“功能委托”以允许它。

  1. 在IIS管理器中,单击左侧的服务器名称。
  2. 在右侧,双击“管理”部分下的“功能委托”。
  3. 将“身份验证-匿名”和“身份验证-Windows”都更改为“读/写”。

如果使用IIS Express进行调试,则必须执行类似的操作:

  1. 在项目文件夹中,打开文件.vs\config\applicationhost.config
  2. 修改这两行,使它们说"Allow"
<section name="anonymousAuthentication" overrideModeDefault="Allow" />
<section name="windowsAuthentication" overrideModeDefault="Allow" />

接下来,更新您的登录页面以默认隐藏用户名和密码字段(假设它们位于ID为loginBox的框中)。这个想法是您对WinLogin操作执行AJAX请求,如果成功,则将用户转发到主页或他们尝试访问的任何页面。如果您使用jQuery,它将看起来像这样:

$.get("@Url.Action("WinLogin", "Auth")")
    .done(function() {
        //success! forward to the page they want
        window.location.replace(returnUrl);
    }).fail(function() {
        //failed - show manual login prompt
        $("#loginBox").show();
    });
});

只要您的网站已经是一个受信任的网站(我假设您已经在使用Windows身份验证,那么我假设是这样),那么Windows身份验证将在该AJAX GET请求期间进行。

请注意使用window.location.replace(),它不会将登录页面添加到浏览器历史记录中,因此,如果用户随后单击“后退”按钮,则他们不会返回到登录页面。它使事情变得更加无缝。

您还可以添加一个加载圆圈或其他内容,以指示用户在GET发生时应等待,但是您可以决定。

有了这一切,用户体验应该是:

  1. 他们访问页面。
  2. 未通过身份验证,因此将其重定向到登录页面。
  3. 登录页面在后台尝试Windows身份验证。
  4. 如果Windows身份验证成功,则会自动将其重定向回所需的页面。
  5. 如果Windows身份验证失败,则会出现用户名和密码框,并且它们可以手动登录。