使用 Graph API 更新 Azure Active Directory 上的用户映像(c# .Net Windows service)



我的网络管理员已在MS Windows Server 2008上配置了Local(on Prem)MS Active Directory,现在它们已在混合模式下移动到Azure Active Directory,例如保持两个目录同步。

之前,我已经写了一个Windows服务,以在安装MS AD的机器上运行,而该服务实际上所做的是如下

1:在启动服务之前设置配置

2:服务在指定的间隔后运行,并从本地Intranet Web服务器中检索用户,该服务器需要在AD上更新。(用户形式,名称,图像等)

3:从Intranet Web服务器检索到的用户具有唯一的名称,并且已经在本地广告上映射了,因此我在广告上搜索了cn ='cn =&quort'

的用户。

4:成功搜索后,我可以拥有用户目录的实例,并且可以更新其缩略图照片。

以下是简短的代码

foreach (var userInDB in usersList)
            {
                string webServerAddress = ConfigurationManager.AppSettings["WebserverAddress"];
                string ImagePath = webServerAddress + userInDB.ImagePath;
                try
                {
                    using (DirectorySearcher dsSearcher = new DirectorySearcher(myLdapConnection))
                    {
                        dsSearcher.Filter = "(&(objectClass=user) (cn="+ userInDB.UserName+"))";
                        SearchResult result = dsSearcher.FindOne();
                        if (result != null)
                        {
                            using (DirectoryEntry user = new DirectoryEntry(result.Path))
                            {
                                using (var webClient = new WebClient())
                                {
                                    
                                    byte[] userImage = webClient.DownloadData(ImagePath);
                                    byte[] userImageThumbnail =CreateThumbnail(userImage,96);
                                    Log4Net.WriteLog("Image File Converted to bytes", LogType.GENERALLOG);
                                    user.Properties["thumbnailPhoto"].Clear();
                                    user.Properties["thumbnailPhoto"].Add(userImageThumbnail);
                                    user.CommitChanges(); 
                                }
                            }
                            new UserServices().UpdateUser(userInDB.UserId);
                        }
                        else
                        {
                            
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log4Net.WriteException(ex);
                }
            }

到目前为止,该服务运行完美,并从本地广告上的本地Intranet Web服务器同步我的用户映像。

现在,进入Azure AD,我想在Azure AD上同步相同的图像。快速r& d后,我来了以下解决方案

1:我可以使用图形API并使用以下HTTP请求

更新用户
PATCH /users/{id | userPrincipalName}/photo/$value  

我对此解决方案的关注如下

1: dis userprincipalname和cn是常见的身份(我对网络管理的了解很低,而且我没有配置那些本地AD和Azure AD,所以我不知道如何如何来本地广告与Azure AD同步)。我需要确保通过提供相同的用户名(对于用户principalname)访问Azure AD中的用户,我用来在本地AD(对于CN)中访问它。

2:我的第二个问题是,当我经过有关配置MS图API的文档时,例如

(i)注册您的应用。

(ii)在您的应用程序上为Microsoft Graph配置权限。

(iii)获得管理员同意。

(iv)获取访问令牌。

(v)使用访问令牌调用Microsoft Graph。

我不完全理解第三点,例如在指定的间隔之后,该方案如何适合自行运行的Windows服务?获得管理员同意并以后使用该服务是一次工作。是否有一个方案,我们可以一次获得一次注册应用程序的管理员同意(最好是在单独的应用程序中),并使用Windows服务以稍后访问Azure AD,而无需任何问题。

3:我对整个情况的第三个也是最后一个担忧是" 我真的需要做这一切?&quort'

我经历了一些文章,例如

https://support.office.com/en-ie/article/active-directory-connect-andnect-and-connect-and-365-856f2f2f2f62-a6e8-4ab0-4ab0-817b-817b-adabd8f27332

说明Active Directory Connect和Office 365. Windows Service上的PREM AD上的本地广告并配置Azure AD以自动更新(同步),例如让它在网络管理员上以配置两个目录以自动进入同步。

我真的需要分别更新本地广告和Azure广告吗?(在单个Windows服务或2个Windows服务中?)

底线:我是Azure AD甚至AD的新手,上面的描述是我的快速R& d的结果,我尚未开发完整的环境来实现解决方案,例如获取Office 365的免费开发人员帐户,在Windows Server上设置本地广告,在Microsoft App注册门户网站上注册我的应用程序,然后完成工作的其余工作。因为在继续前进和设置环境之前,我需要从我要朝正确方向的Azure AD的专家那里开始,并且哪种解决方案适合上述方案。要再次重复"我想将用户的映像从我的本地Intranet Web服务器更新为Azure AD&quort"

请建议我最好的行。

thanx和问候,

您的问题中有许多问题,但我会尝试解决每个部分:

1:用户principalname和cn是常见的身份

是的,您的广告应具有每个用户的用户principalname。您应该能够查找用户,然后从广告中获取UPN。

2:获得管理员同意并以后使用该服务是一次工作。是否有一个方案,我们可以获得一次注册应用程序的管理员同意(最好是在单独的应用程序中),并使用Windows服务稍后访问Azure AD,而无需任何问题。

是的,管理员同意申请是一次(除非您需要更改权限范围)。对于这种类型的解决方案(否UI),您应该考虑使用客户端凭证与授权身份验证。借助客户端凭据,您可以获得应用程序ID和秘密,并在每次需要时使用这些应用程序来获得访问令牌。您不需要用户作为身份验证流的一部分登录&您无需处理刷新令牌。客户凭证验证流

3:我对整个情况的第三个也是最后一个担忧是"我真的需要做这一切吗?"

您可能会悲伤。AD Connect将Thumbnailphoto同步到AAD,但是,如果用户在O365中更新照片,则缩略图将不再从AAD到Office 365(EXO/SPO)再次自动同步。这会破坏同步,您可能需要将照片推到Microsoft图表上,如果用户有一个邮箱,这将使照片放在EXO中,这是O365的大部分o365从中拿出照片的位置。简短的答案,是的,您可能应该。

最新更新