配置 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。
打开命令提示符并输入
>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.
用户将只使用他们的用户名登录,而不使用域。所以正确的用户名是 Chris,而不是 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 身份验证,也不要忘记从 <authentication>
标签中删除 <forms>
子标签。
【讨论】:
以上是关于配置 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系列:核心技术与环境配置