AAD Connect自定义同步用户上云

使用场景:我想同步本地AD域的那些用户信息、账号上云端做SSO登录和权限管控,但是不希望使用快速上传一股脑传上去,所以使用自定义同步功能上传,这是一篇对AAD CONNECT这个应用的详解和配置步骤推荐
在这里插入图片描述

AD Connect如何自定义配置?

![[Pasted image 20240614103857.png]]

使用快速设置,默认是使用同步密码哈希值去AAD的,实际上AD同步有三种同步方式,密码哈希,本地AD验证和ADFS联合身份验证。

所需的组件

![[Pasted image 20240614104055.png]]

在 Azure AD Connect 的配置中,“指定自定义同步组”功能允许你指定哪些 Active Directory 组的成员有权限管理或参与 Azure AD Connect 同步操作。这个功能的主要目的是提高安全性和管理的精细度,确保只有授权的用户能够执行和管理同步操作。

各个组的具体功能和权限
管理员组 (Administrators Group)
  • 用途:用于管理 Azure AD Connect 的配置和同步过程。
  • 权限
    • 访问和修改 Azure AD Connect 配置。
    • 配置同步规则和过滤器。
    • 手动触发同步操作。
    • 查看和管理同步日志和状态。
  • 配置:你需要在此字段中输入一个 Active Directory 组的名称,例如 demo\SyncAdmins。
运算符组 (Operators Group)
  • 用途:用于执行日常同步任务的组。
  • 权限
    • 手动触发同步操作(如全量同步和增量同步)。
    • 查看同步状态和日志。
    • 但是,运算符组的成员通常不能修改同步配置。
  • 配置:在此字段中输入一个 Active Directory 组的名称,例如 demo\SyncOperators。
浏览组 (Browse Group)
  • 用途:用于具有只读权限的组。
  • 权限
    • 查看 Azure AD Connect 的配置和同步状态。
    • 访问同步日志。
    • 但不能执行同步操作或修改配置。
  • 配置:在此字段中输入一个 Active Directory 组的名称,例如 demo\SyncBrowsers。
密码重置组 (Password Reset Group)
  • 用途:用于重置用户密码的组。
  • 权限
    • 执行密码重置操作,将 Azure AD 中重置或更改的密码同步回本地 AD。
  • 配置:在此字段中输入一个 Active Directory 组的名称,例如 demo\SyncPasswordReset.
连接目录

![[Pasted image 20240614112323.png]]

在 Azure AD Connect 的配置过程中,选择链接目录时,需要提供一个具有足够权限的 Active Directory (AD) 林账户。这个账户必须是能够读取和写入 AD 中用户和组信息的账户。以下是一些关于选择和配置这个账户的建议:

  1. 域管理员账户

    • 最常用的选择是使用域管理员账户。域管理员账户通常具有足够的权限来读取和写入所有需要的 AD 对象。
    • 示例:如果你的域是 demo.com,一个域管理员账户可能是 demo\administrator
  2. 自定义服务账户

    • 为了安全和最佳实践,你可以创建一个专门的服务账户,授予它必要的权限,而不是使用域管理员账户。
    • 该账户需要以下权限:
      • 读取和写入用户和组信息:确保该账户可以读取和写入所有需要同步的 OU 中的用户和组。
      • 密码回写权限(如果使用密码回写功能):该账户需要有权限重置密码。
域/OU筛选

![[Pasted image 20240614112216.png]]

同步不推荐的 OU(组织单位)可能会带来一些问题和安全隐患。以下是具体的风险和潜在问题:

具体风险
增加不必要的同步负担
  • 同步性能:同步大量不必要的对象会增加 Azure AD Connect 的负担,导致同步过程变慢,影响整体性能。
  • 数据量增加:不必要的对象会增加 Azure AD 中的数据量,可能导致管理复杂性增加。
安全隐患
  • 系统账户暴露:内置的系统账户(如 BuiltinDomain Controllers 等)如果被同步到 Azure AD,可能会增加潜在的安全攻击面。攻击者可以尝试利用这些账户进行恶意活动。
  • 不必要的权限:系统 OU 中的账户和组可能拥有不必要的高权限。如果这些账户被同步到 Azure AD,可能会导致权限管理混乱,甚至泄露敏感权限。
  • 跨域信任风险:同步 ForeignSecurityPrincipals 中的对象可能导致跨域信任相关的问题,增加潜在的安全风险。
管理复杂性
  • 管理复杂性增加:同步大量不必要的 OU 和组会增加 Azure AD 的管理复杂性,使得权限管理和策略应用变得更加困难。
  • 误操作风险:同步到 Azure AD 的不必要对象可能会被误操作,导致系统配置错误或意外权限分配。
具体的 OU 和潜在问题
  1. Builtin OU

    • 包含内置的安全主体和组,通常这些对象在 Azure AD 中没有实际用途,但可能会被误用或误配置。
  2. Domain Controllers OU

    • 包含域控制器的计算机账户,这些账户不需要在 Azure AD 中存在。同步这些账户可能导致不必要的复杂性和潜在的安全风险。
  3. Computers OU

    • 包含计算机账户,通常不需要在 Azure AD 中管理这些对象。同步这些对象会增加不必要的数据量。
  4. System OU

    • 包含系统相关的对象,这些对象不需要在 Azure AD 中使用,增加潜在的误操作风险。
  5. Infrastructure、LostAndFound、ForeignSecurityPrincipals OU

    • 这些 OU 包含系统或跨域信任相关的对象,同步这些对象可能增加管理复杂性和潜在的安全隐患。

最佳实践

  • 只同步需要的 OU:仅同步那些包含实际使用的用户和组的 OU,避免同步系统和不必要的对象。
  • 最小权限原则:确保同步的对象和账户仅具有执行其职能所需的最小权限,减少潜在的安全风险。
  • 定期审核:定期审核同步配置和对象,确保同步的对象仍然符合当前的业务和安全需求。
标识用户

![[Pasted image 20240614112707.png]]

这个页面是 Azure AD Connect 配置向导中的“唯一标识用户”步骤。在这个步骤中,你需要选择如何在本地目录和 Azure AD 中标识用户。标识用户的方式有助于确保同步过程中用户的唯一性和一致性。以下是页面中各选项的解释以及推荐的配置:

用户在本地目录中的表示方式
  1. 用户仅跨所有目录表示一次

    • 每个用户在整个目录中仅表示一次,确保唯一性。
  2. 用户标识跨多个目录存在

    • 当用户可能存在于多个目录中时使用此选项,通过特定的匹配方式确保唯一性。
匹配方式
  1. 邮件属性

    • 使用用户的邮件属性作为唯一标识。适用于用户的邮件地址在整个组织中是唯一的情况。
  2. ObjectSID 和 msExchMasterAccountSID/msRTCSIP-OriginatorSID 属性

    • 使用对象的 SID 以及 Exchange 或 Lync 的 SID 属性进行匹配。适用于用户具有多个身份的情况(如资源邮箱、Lync 用户等)。
  3. SAMAccountName 属性和 MailNickName 属性

    • 使用用户的 SAMAccountName 和 MailNickName 进行匹配。适用于使用这些属性进行标识的情况。
  4. 特定属性

    • 使用自定义的特定属性进行匹配。适用于有特殊需求的自定义环境。
选择使用 Azure AD 标识用户
  1. 允许 Azure 管理源定位

    • 允许 Azure 自动管理和处理用户的标识和源定位。这是推荐的默认选项。
  2. 选择特定属性

    • 手动选择特定属性进行用户标识和源定位。适用于有特殊需求的自定义环境。
推荐配置

对于大多数情况,推荐的配置是:

  • 用户在本地目录中的表示方式

    • 选择“用户仅跨所有目录表示一次”。这可以确保每个用户在整个目录中是唯一的,避免重复。
  • 匹配方式

    • 如果你的用户邮件地址在整个组织中是唯一的,推荐选择“邮件属性”。这是一个常见且直观的标识方式。
    • 如果你有特殊的匹配需求,可以选择“特定属性”并配置相应的属性。
  • 选择如何使用 Azure AD 标识用户

    • 选择“允许 Azure 管理源定位”。这是默认和推荐的选项,简化了管理并确保一致性。
最佳实践
  1. 选择“用户仅跨所有目录表示一次”
  2. **选择“邮件属性”**作为匹配方式(如果适用)。
  3. 选择“允许 Azure 管理源定位”

邮件属性:如果你选择了“邮件属性”,确保每个用户的邮件地址在本地 AD 和 Azure AD 中都是唯一的。
特定属性:如果选择“特定属性”,需要确保你选择的属性在所有用户中是唯一且一致的。

通过这种配置,你可以确保用户在本地 AD 和 Azure AD 之间的一致性和唯一性,简化同步管理并减少潜在的问题。

筛选用户和设备

前面已经选择了要同步的 OU。在这一步,你可以进一步细化同步的范围,选择特定的用户和设备进行同步。这个额外的筛选步骤提供了更精细的控制,以确保你只同步特定的用户和设备,即使他们位于已经选择的 OU 内。

![[Pasted image 20240614114646.png]]

![[Pasted image 20240614131555.png]]

同步所有用户和设备
  • 选项:同步所有用户和设备。
  • 作用:选择此选项将会同步你在之前选择的所有 OU 中的所有用户和设备。
  • 使用场景:如果你希望同步所有位于已选择 OU 内的用户和设备,选择此选项。
同步所选内容
  • 选项:同步所选内容。
  • 作用:选择此选项可以进一步指定一个包含将被同步的用户和设备的组。只有属于该组的用户和设备会被同步到 Azure AD,即使他们在已选择的 OU 内。
  • 使用场景:如果你希望在已选择的 OU 内进一步筛选同步对象,只同步特定组中的用户和设备,选择此选项。
具体配置步骤
  1. 选择同步范围

    • 同步所有用户和设备:适用于需要全面同步所有已选择 OU 内用户和设备的情况。选择此选项后,点击“下一步”继续。
    • 同步所选内容:适用于只想同步特定用户和设备的情况。选择此选项后,继续配置组名或 DN。
  2. 配置组名或 DN

    • 在“组”字段中输入组的名称或 DN。
    • 例如,如果你有一个组名为 AVDUsers,你可以输入 AVDUsers 或者该组的 DN(如 CN=AVDUsers,OU=Groups,DC=demo,DC=com)。
    • 点击“解析”按钮确认组名或 DN 是否正确。

注意:在 Azure AD Connect 的这一配置步骤中,你不能直接在“组”字段中输入多个组名称来实现同步多个组。你需要采用一种方式来实现同步多个组中的成员。以下是实现这一目标的具体步骤和方法:

方法一:创建一个包含多个组成员的单个组
步骤 1:创建一个主组
  1. 在 Active Directory 用户和计算机中,创建一个新的安全组,例如 MasterSyncGroup
  2. 将需要同步的多个组(例如 Group1Group2)的所有成员添加到 MasterSyncGroup 中。
步骤 2:在 Azure AD Connect 中同步主组
  1. 在 Azure AD Connect 配置界面,选择“同步所选内容”。
  2. 在“组”字段中输入 MasterSyncGroup 的 DN(Distinguished Name),例如:
    CN=MasterSyncGroup,OU=Groups,DC=demo,DC=com
    
  3. 点击“解析”按钮确认组名。
示例 PowerShell 脚本:将多个组的成员添加到一个主组中
# 需要同步的组列表
$groups = @("Group1", "Group2")

# 主组
$masterGroup = "MasterSyncGroup"

# 检查主组是否存在,如果不存在则创建
if (-not (Get-ADGroup -Filter {Name -eq $masterGroup})) {
    New-ADGroup -Name $masterGroup -GroupScope Global -GroupCategory Security -Path "OU=Groups,DC=demo,DC=com"
}

# 将多个组的成员添加到主组中
foreach ($group in $groups) {
    $members = Get-ADGroupMember -Identity $group
    foreach ($member in $members) {
        Add-ADGroupMember -Identity $masterGroup -Members $member
    }
}
方法二:使用同步规则编辑器配置筛选条件

如果你不想创建一个包含多个组成员的主组,可以通过配置 Azure AD Connect 同步规则编辑器来实现同步多个组。

步骤 1:打开同步规则编辑器
  1. 在安装了 Azure AD Connect 的服务器上,打开“Azure AD Connect 同步管理器”。
  2. 选择“配置”并打开“同步规则编辑器”。
步骤 2:创建或编辑同步规则
  1. 创建一个新的入站同步规则,或编辑现有的同步规则。
步骤 3:配置规则
  1. 创建一个新的规则,名称例如“SyncMultipleGroups”。
  2. 配置范围条件来匹配多个组,例如:
    • memberOf=CN=Group1,OU=Groups,DC=demo,DC=com
    • memberOf=CN=Group2,OU=Groups,DC=demo,DC=com
  3. 使用 OR 逻辑将这些条件组合起来:
    (memberOf=CN=Group1,OU=Groups,DC=demo,DC=com) 
    (memberOf=CN=Group2,OU=Groups,DC=demo,DC=com)
    
步骤 4:保存规则并触发同步
  1. 保存你创建的同步规则。
  2. 手动触发同步,确保新规则生效:
    Start-ADSyncSyncCycle -PolicyType Delta
    
密码写回

在配置 Azure AD Connect 时,你可以选择启用一些可选功能来增强同步功能。每个可选功能的具体用途和推荐配置如下:

![[Pasted image 20240614131939.png]]

可选功能解释和推荐配置
  1. Exchange 混合部署

    • 用途:如果你在本地有 Exchange 服务器,并希望与 Exchange Online 实现混合部署。
    • 推荐:如果你没有本地 Exchange 服务器或不需要混合部署,不要选择。
  2. Exchange 邮件公用文件夹

    • 用途:用于同步本地 Exchange 公用文件夹到 Exchange Online。
    • 推荐:如果你没有使用 Exchange 公用文件夹,不要选择。
  3. Azure AD 应用和属性筛选

    • 用途:用于选择性地同步 Azure AD 的特定应用和属性。
    • 推荐:如果你需要精细控制哪些应用和属性同步,可以选择。否则,默认不勾选。
  4. 密码哈希同步

    • 用途:将本地 Active Directory 的密码哈希同步到 Azure AD,允许用户使用相同的密码登录 Azure AD 服务。
    • 推荐建议启用。这是实现单一登录(SSO)和提高用户体验的关键功能。
  5. 密码写回

    • 用途:允许在 Azure AD 中重置或更改的密码写回到本地 AD。
    • 推荐建议启用。这可以提高用户密码管理的灵活性,允许用户通过 Azure AD 重置密码。
  6. 组写回

    • 用途:将 Azure AD 中的组同步回本地 AD。
    • 推荐:仅在你需要将 Azure AD 组同步回本地 AD 时选择。如果不需要,不要勾选。
  7. 设备写回

    • 用途:将 Azure AD 中注册的设备信息同步回本地 AD。
    • 推荐建议启用。如果你使用 Azure AD 设备注册和管理,这是一个有用的功能。
  8. 目录扩展属性同步

    • 用途:同步扩展属性,这些属性可能包括自定义属性或第三方应用需要的属性。
    • 推荐:仅在你有特定需求时选择。如果不需要,不要勾选。
最佳实践

根据常见的需求和最佳实践,以下是推荐的勾选配置:

  • 密码哈希同步(建议启用)
  • 密码写回(建议启用)
  • 设备写回(建议启用,如果你使用 Azure AD 设备注册和管理)

其他选项保持默认未选状态,除非有明确的需求。完成配置后,点击“下一步”继续配置 Azure AD Connect。

<think>好的,我现在需要帮助用户了解如何在Angular应用中同时实现Azure AD登录和自定义账密登录。首先,我得理解用户的需求。他们可能希望用户可以选择两种登录方式之一,或者根据不同情况使用不同的认证方法。接下来,我需要回忆Angular中处理身份验证的常见方法,尤其是涉及到多种身份验证策略的情况。 首先,Azure AD登录通常使用微软的MSAL(Microsoft Authentication Library)库,而自定义账密登录可能涉及JWT或其他基于表单的认证。这两种方式可能需要不同的配置和处理流程。我需要确保这两个认证系统能够共存,并且不会互相冲突。 然后,我需要考虑如何组织代码结构。可能需要创建两个不同的服务,分别处理AAD自定义登录的逻辑。或者使用一个统一的认证服务,内部根据用户的选择调用不同的认证方法。这里要注意的是,Angular的服务和模块化结构如何支持这种分离。 接下来,路由保护的问题。如果应用中有需要认证的路由,需要确保两种认证方式都能被路由守卫正确处理。可能需要一个通用的守卫,能够检查两种不同的认证状态,或者根据当前认证方式动态判断。 另外,用户的状态管理也很重要。用户通过AAD登录后,会得到一个访问令牌,而自定义登录可能会返回另一个令牌或会话信息。前端需要能够处理这两种不同的用户状态,并在UI上正确显示登录状态。 还需要考虑如何处理令牌的存储和刷新。MSAL库通常会自己处理令牌的存储和刷新,而自定义登录可能需要手动处理这些细节。需要确保两种方式在存储令牌时不会互相覆盖,并且能够安全地管理这些敏感信息。 然后是HTTP拦截器的问题。对于AAD,可能需要使用MSAL的拦截器来自动附加令牌到请求头,而自定义登录可能也需要类似的拦截器。可能需要编写一个自定义的拦截器,根据当前使用的认证方式附加相应的令牌。 还有一点是,如何让用户在前端选择登录方式。可能需要一个登录页面,提供两个按钮,分别跳转到AAD登录或自定义登录的表单。这里需要注意路由的配置和组件的组织。 测试方面,需要确保两种登录方式都能正常工作,切换时不会出现冲突,并且用户登出时能同时清除两种认证的状态。此外,后端也需要支持这两种认证方式,可能涉及到不同的端点或认证中间件。 最后,可能需要查阅Angular和MSAL的官方文档,确认最新的配置方法,以及如何处理多个身份验证实例的情况。同时,寻找是否有社区的最佳实践或示例代码,来参考如何整合这两种机制。 总结一下,步骤大致如下: 1. 分别配置AAD(使用MSAL)和自定义登录的服务。 2. 创建认证服务来协调两种登录方式。 3. 处理路由守卫以支持多种认证状态。 4. 实现HTTP拦截器附加不同的令牌。 5. 设计UI让用户选择登录方式。 6. 确保后端支持两种认证方式。 7. 测试整个流程,处理可能的冲突和状态管理问题。</think>在Angular中同时集成Azure ADAAD)登录和自定义账密登录,可通过以下步骤实现结构化整合: --- ### 一、技术方案设计 1. **分离认证策略** - **AAD认证**:使用`@azure/msal-angular`库 - **自定义账密认证**:通过REST API + JWT实现 2. **统一认证服务层** ```typescript // auth.service.ts @Injectable() export class AuthService { constructor( private msalService: MsalService, private http: HttpClient ) {} // AAD登录 aadLogin(): Observable<AuthenticationResult> { return this.msalService.loginPopup(); } // 自定义账密登录 customLogin(credentials: {username: string, password: string}): Observable<{token: string}> { return this.http.post('/api/auth/login', credentials); } } ``` --- ### 二、模块化配置 1. **配置MSAL模块** ```typescript // app.module.ts const msalConfig: Configuration = { auth: { clientId: 'AAD_CLIENT_ID', authority: 'https://login.microsoftonline.com/YOUR_TENANT_ID' } }; @NgModule({ imports: [ MsalModule.forRoot( new PublicClientApplication(msalConfig), { interactionType: InteractionType.Redirect }, { protectedResourceMap: new Map([ ['/api', ['api://API_CLIENT_ID/scope']] ]) } ) ] }) ``` --- ### 三、路由守卫处理 ```typescript // auth.guard.ts @Injectable() export class AuthGuard implements CanActivate { constructor( private authService: AuthService, private msalService: MsalService ) {} canActivate(): boolean { // 检查AAD登录状态 const aadAccounts = this.msalService.instance.getAllAccounts(); if (aadAccounts.length > 0) return true; // 检查自定义登录状态 if (localStorage.getItem('custom_token')) return true; // 未登录则重定向 this.router.navigate(['/login']); return false; } } ``` --- ### 四、HTTP拦截器实现 ```typescript // auth.interceptor.ts @Injectable() export class AuthInterceptor implements HttpInterceptor { constructor( private msalService: MsalService ) {} intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { // AAD保护接口处理 if (req.url.startsWith('/aad_api')) { return this.msalService.acquireTokenSilent({ scopes: ['api://API_CLIENT_ID/scope'] }).pipe( mergeMap(tokenResponse => { const authReq = req.clone({ headers: req.headers.set('Authorization', `Bearer ${tokenResponse.accessToken}`) }); return next.handle(authReq); }) ); } // 自定义认证接口处理 if (req.url.startsWith('/custom_api') && localStorage.getItem('custom_token')) { const authReq = req.clone({ headers: req.headers.set('Authorization', `Bearer ${localStorage.getItem('custom_token')}`) }); return next.handle(authReq); } return next.handle(req); } } ``` --- ### 五、登录组件实现 ```html <!-- login.component.html --> <div class="login-options"> <button (click)="aadLogin()">使用公司账号登录</button> <div class="custom-login"> <input [(ngModel)]="username" placeholder="用户名"> <input [(ngModel)]="password" type="password" placeholder="密码"> <button (click)="customLogin()">登录</button> </div> </div> ``` --- ### 六、关键注意事项 1. **会话管理策略** - AAD会话通过MSAL自动管理 - 自定义登录需手动处理token存储/刷新: ```typescript // 自定义token刷新逻辑 private refreshToken() { return this.http.post('/api/auth/refresh', { refreshToken: localStorage.getItem('refresh_token') }); } ``` 2. **CORS配置** ```typescript // 后端需配置允许的源 Access-Control-Allow-Origin: https://your-angular-app-domain.com Access-Control-Allow-Headers: Authorization, X-Requested-With ``` 3. **安全增强建议** - 对自定义登录接口启用HTTPS - 实现CSRF保护 - 添加登录尝试频率限制 --- ### 七、部署验证步骤 1. 测试AAD登录流程: ```bash ng serve --ssl --port 443 ``` (AAD要求使用HTTPS) 2. 验证自定义登录: ```typescript // 单元测试示例 it('should authenticate with custom credentials', fakeAsync(() => { authService.customLogin({username: 'test', password: 'valid'}) .subscribe(res => { expect(localStorage.getItem('custom_token')).toBeTruthy(); }); })); ``` 通过这种架构设计,既可保持两种认证体系的独立性,又能在应用层实现统一管理。建议通过环境变量区分开发/生产环境的AAD配置参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值