C# Windows身份验证和本地DB用户身份验证

C# Windows身份验证和本地DB用户身份验证,c#,asp.net-mvc,iis,active-directory,windows-authentication,C#,Asp.net Mvc,Iis,Active Directory,Windows Authentication,我正在MVC应用程序中使用windows身份验证模拟。当我打开该应用程序时,浏览器将显示提示以输入凭据并验证域用户 但现在我还想在我的应用程序中创建用户,并想对存储在数据库中的用户进行身份验证 是否可以使用域用户的windows身份验证对应用程序数据库用户进行身份验证。我在这方面做了很多研发,但还没有找到任何解决方案。谢谢你的建议。谢谢 如果我理解正确,您希望同时允许Windows身份验证和窗体身份验证。这不是一件平常的事,但我已经做到了。我是这样做的: 您必须使用表单身份验证作为主要身份验证。

我正在MVC应用程序中使用windows身份验证模拟。当我打开该应用程序时,浏览器将显示提示以输入凭据并验证域用户

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


是否可以使用域用户的windows身份验证对应用程序数据库用户进行身份验证。我在这方面做了很多研发,但还没有找到任何解决方案。谢谢你的建议。谢谢

如果我理解正确,您希望同时允许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身份验证。您可以使用
标记执行此操作:


,这将不会将登录页面添加到浏览器历史记录中,因此如果用户单击“上一步”按钮,则不会返回登录页面。它使事情变得更加无缝

您还可以添加一个加载循环或其他内容,以指示用户应该在该GET发生时等待,但您可以自行决定

所有这些都到位后,用户体验应该是:

  • 他们访问一个页面
  • 它们没有经过身份验证,因此会被重定向到登录页面
  • 登录页面尝试在后台进行Windows身份验证
  • 如果Windows身份验证成功,它们将自动重定向回所需的页面
  • 如果Windows身份验证失败,则会出现用户名和密码框,它们可以手动登录

  • IIS和ASP.NET通常不适用于此类场景。你只是自找麻烦。但如果您坚持,一个可能的选择是1)使用基于表单的身份验证2)在对用户进行身份验证时,同时查询AD和数据库以查看用户凭据是否有效。在那里,您无法使用Microsoft的大多数内置类,并且必须编写大量自定义代码。默认情况下,同时启用windows身份验证和自定义用户身份验证是无效的。您必须手动处理来自域和外部的请求。看看这个。