【问题标题】:Windows Authentication and local DB user authenticationWindows 身份验证和本地数据库用户身份验证
【发布时间】:2020-06-05 13:43:44
【问题描述】:

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

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

是否可以对应用程序数据库用户进行身份验证以及域用户的 Windows 身份验证。我对此做了很多研发,但还没有找到任何解决方案。我会很感激你的建议。谢谢!

【问题讨论】:

  • IIS 和 ASP.NET 通常不是为这种情况而设计的。你只是麻烦自己。但是,如果您坚持,一种可能的选择是 1) 使用基于表单的身份验证 2) 在对用户进行身份验证时,查询 AD 和数据库以查看用户凭据是否有效。在那里你不能使用微软的大部分内置类,并且必须编写相当多的自定义代码。
  • 默认情况下,同时启用 windows 身份验证和自定义用户身份验证无效。您必须手动处理来自域和外部的请求。检查这个。 stackoverflow.com/questions/34963618/…

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


【解决方案1】:

如果我理解正确,您希望同时允许 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 身份验证失败,则会出现用户名和密码框,他们可以手动登录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-05
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多