配置 ASP.NET MVC 以针对 AD 进行身份验证

Posted

技术标签:

【中文标题】配置 ASP.NET MVC 以针对 AD 进行身份验证【英文标题】:Configure ASP.NET MVC for authentication against AD 【发布时间】:2012-05-03 23:33:42 【问题描述】:

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

我猜是这样的:

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

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

在我的例子中,有效用户是特定 AD 域中的某个人。

【问题讨论】:

【参考方案1】:

表单认证

您可以使用普通表单身份验证来针对 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 来成功验证用户身份。

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

http://helios.ca/2009/05/04/aspnet-mvc-forms-authentication-with-active-directory/

Windows 身份验证

如果您开始新项目,您可以随时从模板中选择Intranet 应用程序,一切都由您负责

如果你想手动做,你需要改变:

    启用 Windows 身份验证 禁用匿名身份验证

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

IIS 7 和 IIS 8

    打开 IIS 管理器并导航到您的网站。 在功能视图中,双击身份验证。

    在身份验证页面上,选择 Windows 身份验证。如果 Windows 身份验证不是一个选项,您需要确保 Windows 身份验证 已安装在服务器上。

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

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

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

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

IIS Express

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

在你的web.config 中有类似的东西

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

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

就是这样!

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

@User.Identity.Name

这将向您显示 Domain\Username 喜欢我:

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

http://www.asp.net/mvc/tutorials/older-versions/security/authenticating-users-with-windows-authentication-cs

【讨论】:

没看懂,没有登录页面?它应该要求登录或获取当前登录的用户否?不确定我是否理解,因为您在 web.config 中硬编码了用户名/密码 @coolbreeze 没有硬编码,用户名是你登陆Windows电脑的时候得到的,就是Windows认证,那为什么又要密码呢? 我指的是这个``` connectionStringName="ADConn" connectionUsername="domain/user" connectionPassword="pwd" />``` 你什么都不需要,这是MembershipProvider的一个简单例子,连接字符串是一个LDAP字符串:connectionString="LDAP://YourConnection" @coolbreeze - 以防万一不清楚(对不起,如果我在堆积) - 将 Active Directory 视为数据库,而 LDAP 是有助于与数据库通信的“技术”。 web.config 中的连接字符串仅包含访问 AD“数据库”的身份验证,当前登录的用户通过 AD 进行身份验证,其设置和解释方式。我们在我们的组织中使用它。【参考方案2】:

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

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

第 1 步:ACCOUNTCONTROLLER.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 步:ACCOUNTVIEWMODELS.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 连接字符串可能需要几个步骤:

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

    打开命令提示符并输入&gt;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。

【讨论】:

链接失效(404) dsquery 服务器给了我 3 CN=PRIMARY01, CN=PRIMARY02 和 CN=PRIMARY03 ?有什么用? Windows 身份验证,而不是表单身份验证? 这也适用于 Windows 10,但需要更改为“为 Windows 7 服务器操作系统安装远程服务器管理工​​具” 我已经尝试过了,但即使设置了 cookie,我仍然会被重定向回登录页面。太令人沮丧了。【参考方案3】:

我找到了这个检查 AD 安全组的链接:

Active Directory Authentication in ASP.NET MVC 5 with Forms Authentication and Group-Based Authorization

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

【讨论】:

以上是关于配置 ASP.NET MVC 以针对 AD 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core MVC 向 Azure AD 验证用户,然后创建 JWT Bearer Token 以调用 Web API

Azure AD 与 ASP.NET Core MVC 中的标识

使用 Azure AD 的 Asp.net core mvc 基于角色的授权

解读ASP.NET 5 & MVC6系列:核心技术与环境配置

asp.net mvc 之旅—— 第三站 路由模板中强大的自定义IRouteConstraint约束

使用自定义数据库而不是 ASPNETDB 的 ASP.NET MVC 身份验证?