60

针对 Active Directory 对 ASP.NET MVC 应用程序的用户进行身份验证的高级步骤是什么?

我假设是这样的:

  1. 修改 web.config 以使用 Windows 身份验证
  2. 配置 web.config 以使用 ActiveDirectoryMembershipProvider
  3. 将 web.config 配置为使用在 AD 中查找的自定义 RoleProvider

以上看起来是否合理,如果是,我将有效的用户检测逻辑放在哪里?

在我的情况下,有效用户是特定 AD 域中的某人。

4

3 回答 3

88

表单认证

您可以使用普通表单身份验证针对 Active Directory 对用户进行身份验证,因为您只需要 AD 连接字符串:

<connectionStrings>
  <add name="ADConn" connectionString="LDAP://YourConnection" />
</connectionStrings>

并添加 Membership Provider 以使用此连接:

<membership defaultProvider="ADMembership">
  <providers>
    <add name="ADMembership"
         type="System.Web.Security.ActiveDirectoryMembershipProvider,
               System.Web,
               Version=2.0.0.0, 
               Culture=neutral,
               PublicToken=b03f5f7f11d50a3a"
         connectionStringName="ADConn"
         connectionUsername="domain/user"
         connectionPassword="pwd" />
  </providers>
</membership>

您将需要使用username@domain来成功验证用户身份。

这里有一些东西可以让你开始


Windows 身份验证

如果您开始新项目,您可以随时从模板中选择Intranet 应用程序,一切都会为您处理好

在此处输入图像描述

如果要手动执行,则需要更改:

  1. 启用 Windows 身份验证
  2. 禁用匿名身份验证

有关在 IIS7/8 和 IISExpress 上执行此操作的详细信息:

IIS 7 和 IIS 8

  1. 打开 IIS 管理器并导航到您的网站。
  2. 在功能视图中,双击身份验证。
  3. 在身份验证页面上,选择 Windows 身份验证。如果 Windows 身份验证不是一个选项,您需要确保在服务器上安装了 Windows 身份验证。

    要在 Windows 上启用 Windows 身份验证: a)在控制面板中打开“程序和功能”。 b)选择“打开或关闭 Windows 功能”。 c)导航到 Internet 信息服务 > 万维网服务 > 安全并确保选中 Windows 身份验证节点。

    要在 Windows Server 上启用 Windows 身份验证: a)在服务器管理器中,选择 Web 服务器 (IIS) 并单击添加角色服务 b)导航到 Web 服务器 > 安全并确保选中 Windows 身份验证节点。

  4. 在“操作”窗格中,单击启用以使用 Windows 身份验证。

  5. 在身份验证页面上,选择匿名身份验证。
  6. 在“操作”窗格中,单击禁用以禁用匿名身份验证。

IIS 快递

  1. 右键单击 Visual Studio 中的项目并选择使用 IIS Express。
  2. 在解决方案资源管理器中单击您的项目以选择该项目。
  3. 如果“属性”窗格未打开,请将其打开 (F4)。
  4. 在项目的“属性”窗格中: a) 将“匿名身份验证”设置为“禁用”。b) 将“Windows 身份验证”设置为“启用”。

在你web.config有类似的东西

<system.web>
  <authentication mode="Windows" />

  <authorization>
    <deny users="?" />
  </authorization>
</system.web>

就是这样!

现在,当您想要用户身份时,只需调用

@User.Identity.Name

这将向您展示我的Domain\Username喜好:

在此处输入图像描述

这里有一些东西可以让你开始

于 2012-04-23T11:04:45.183 回答
11

这是教程Chris Schiffhauer - Implement Active Directory Authentication in ASP.NET MVC 5 中的解决方案:

您可以通过直接根据用户的域凭据对用户进行身份验证来保护 Active Directory 网络上的 MVC Web 应用程序。

第 1 步:帐户控制器.CS

将您的AccountController.cs文件替换为以下内容:

using System.Web.Mvc;
using System.Web.Security;
using MvcApplication.Models;

public class AccountController : Controller
{
    public ActionResult Login()
    {
        return this.View();
    }

    [HttpPost]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (!this.ModelState.IsValid)
        {
            return this.View(model);
        }

        if (Membership.ValidateUser(model.UserName, model.Password))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            if (this.Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
            {
                return this.Redirect(returnUrl);
            }

            return this.RedirectToAction("Index", "Home");
        }

        this.ModelState.AddModelError(string.Empty, "The user name or password provided is incorrect.");

        return this.View(model);
    }

    public ActionResult LogOff()
    {
        FormsAuthentication.SignOut();

        return this.RedirectToAction("Index", "Home");
    }
}

第 2 步:帐户视图模型.CS

更新您的AccountViewModels.cs(或任何您的 Account 模型类的名称)以仅包含此 LoginModel 类:

using System.ComponentModel.DataAnnotations;

public class LoginModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

第 3 步:WEB.CONFIG

最后,更新您的Web.config文件以包含这些元素。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
      <authentication mode="Forms">
          <forms name=".ADAuthCookie" loginUrl="~/Account/Login" timeout="45" slidingExpiration="false" protection="All" />
      </authentication>
      <membership defaultProvider="ADMembershipProvider">
          <providers>
              <clear />
              <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnectionString" attributeMapUsername="sAMAccountName" />
          </providers>
      </membership>
  </system.web>
  <connectionStrings>
      <add name="ADConnectionString" connectionString="LDAP://primary.mydomain.local:389/DC=MyDomain,DC=Local" />
  </connectionStrings>
</configuration>

获取 LDAP 连接字符串可能需要几个步骤:

  1. 安装适用于 Windows 7 的远程服务器管理工​​具。确保按照安装后的说明通过控制面板将该功能添加到 Windows。

  2. 打开命令提示符并输入>dsquery server

    假设该命令返回以下内容:

    CN=PRIMARY,CN=Servers,CN=DefaultFirstName,CN=Sites,CN=Configuration,DC=MyDomain,DC=Local
    
    • 服务器名称由第一个 CN 值和最后两个 DC 值组成,用点分隔。所以它是primary.mydomain.local

    • 端口是 389。

    • 端口和正斜杠之后的连接字符串部分是结果中以第一个 开头的部分"DC"。所以它是DC=MyDomain,DC=Local

    • 所以完整的连接字符串是

      LDAP://primary.mydomain.local:389/DC=MyDomain,DC=Local.
      
    • 用户将只使用他们的用户名登录,而不使用域。所以正确的用户名是 C​​hris,而不是 MYDOMAIN\Chris。

于 2016-04-06T11:22:22.683 回答
0

我发现这个链接检查 AD 安全组:

ASP.NET MVC 5 中的 Active Directory 身份验证与表单身份验证和基于组的授权

唯一的问题是此设置使用登录页面来捕获 AD 的用户名/密码凭据。我将身份验证从“FORMS”更改为“WINDOWS”,因为我的应用程序将始终从网络内访问。如果您不打算使用 FORMS 身份验证,也不要忘记<forms>从标签中删除子标签。<authentication>

于 2019-04-26T19:32:22.300 回答