【问题标题】:ASP.NET MVC 5 Authentication based on IIS server's Windows domain基于 IIS 服务器的 Windows 域的 ASP.NET MVC 5 身份验证
【发布时间】:2014-06-30 13:31:48
【问题描述】:

我需要创建一个可通过 Internet 访问的 ASP.NET MVC 5 Web 应用程序项目。它将在属于 Windows 域的 IIS 服务器上运行,并且已经通过普通 HTTP 身份验证对某些 URL 进行了用户身份验证(接受域用户帐户)。

对于我的项目,我希望有一个登录页面,该页面将要求输入用户名和密码并针对同一个 Windows 域进行身份验证。用户不会使用其本地 Windows 域用户登录。我发现了对类似问题的引用,但使用的是 Forms 身份验证或 ASP.NET 2.0,我想这不是我应该使用更新的基础架构的方式。

我正在使用 Visual Studio 2013 Web Express,当我使用 .NET Framework 4.5 模板创建新项目时,它允许我在无身份验证、个人用户帐户、组织帐户或 Windows 身份验证之间进行选择。

在问这里之前我已经研究了很多,但我没有找到任何线索,关于最后三个选项中的哪一个可以让我按照我想要的方式配置我的应用程序,尽管我认为 Windows 身份验证仅限于 Intranet应用程序。
在我的研究中,我意识到了 System.DirectoryServices.dll,但我不确定这是否是我实现身份验证逻辑的方式。

非常感谢任何提示/链接,但示例代码总是更好。

谢谢!

【问题讨论】:

  • 嗨,Alexandre,欢迎来到 SO。关于您的问题,我们需要更多信息来回答您的问题。您说您的用户将通过互联网访问,但您没有注意您的用户的凭据来自哪里(您的本地 AD 或另一个 AD)。此外,您没有注意您希望您的用户通过哪种工作流程“登录”,您的安全考虑是什么等等。但我的猜测是,如果您只是从本地 AD 验证用户,他们恰好是从您的网络外部连接,然后只需将身份验证设置为 Windows Authentication 即可。
  • @Aron:用户的凭据将来自用于使用 HTTP auth 进行身份验证的同一个 Windows 域控制器(我猜是 AD)。用户将通过进入登录页面并输入用户名/密码进行身份验证,这与 HTTP 身份验证对话框非常相似,但使用的是 Razor 页面。我不知道 Windows 身份验证是否是最佳选择,因为用户不会使用与本地域相同的用户名登录。它应该像“个人用户帐户”一样工作,只是用户/角色不会存储在 SQL 数据库中,而是通过 Windows 域管理进行管理。
  • 有什么理由要使用登录表单而不是浏览器登录?使用浏览器要容易得多,因为它只是 Windows Auth 而不是 Basic,而您所说的需要 On-Premises Organizational Authentication,这有点过头了(通常在您将网站托管在站点外时使用)。
  • @Aron:Windows Auth 超过 Basic 是否需要 HTTPS(出于安全原因)?对于On-Premises Organizational Authentication,我在哪里可以找到所需的“本地授权”(元数据文档 URL)?
  • 不。您可以将 Basic Auth 与 HTTP 一起使用。但是,这将是完全不安全的(不比您的建议安全)。但是,您也可以使用Digest Auth,它比表单身份验证或基本身份验证更强大。

标签: c# authentication asp.net-mvc-5


【解决方案1】:

这是一种使用PrincipalContext (System.DirectoryServices.AccountManagement) 验证域凭据的方法。

public static bool ValidateDomainCredentials(string username, string password)
{

    if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
    {
        return false;
    }

    using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "mydomain"))
    {
           return pc.ValidateCredentials(username, password);
    }
}

在登录之前调用它以确保用户在活动目录中。

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    ...
    var user = await UserManager.FindByNameAsync(model.Username);
    if (user != null && ValidateDomainCredentials(user.user_Name, model.Password))
    {
        await SignInAsync(user, model.RememberMe);
        return RedirectToLocal(returnUrl);
    }
}

【讨论】:

    猜你喜欢
    • 2013-12-07
    • 2014-02-05
    • 2021-11-13
    • 2013-11-07
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多