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

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

我猜是这样的:

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

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

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

【问题讨论】:

    标签: asp.net-mvc active-directory


    【解决方案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 来成功验证用户身份。

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


    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 Express

    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 喜欢我:

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

    【讨论】:

    • 没看懂,没有登录页面?它应该要求登录或获取当前登录的用户否?不确定我是否理解,因为您在 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 连接字符串可能需要几个步骤:

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

    2. 打开命令提示符并输入&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; 子标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-06
      • 2020-01-14
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多