【问题标题】:User Email Address Operations using Active Directory Graph API使用 Active Directory Graph API 的用户电子邮件地址操作
【发布时间】:2016-02-23 14:57:46
【问题描述】:

我目前在 C# 云服务应用程序中使用 Microsoft.Azure.ActiveDirectory.GraphClient,该应用程序根据存储在数据库中的信息管理 Office 365 中的用户配置和更新。

我面临的问题是用户邮件地址的设置。在提供新用户时,设置新用户对象的邮件地址属性会导致 Graph 客户端抛出错误。配置新用户时,主 SMTP 地址会自动设置为用户的 UPN。以下代码将成功创建新用户并将主 SMTP 地址设置为与为 UserPrincipalName 设置的值相同:

IUser newUser = new User();
newUser.DisplayName = "Firstname Surname";
newUser.UserPrincipalName = "someone@somewhere.com";
newUser.AccountEnabled = true;
newUser.MailNickname = "firstnamesurname";
newUser.ImmutableId = "0k3otwAAEkm8vGSKbJqRZg==";
newUser.PasswordProfile = new PasswordProfile
{
    Password = "somerandompassword",
    ForceChangePasswordNextLogin = true
};
newUser.UsageLocation = "GB";
_activeDirectoryClient.Users.AddUserAsync(newUser).Wait();

很公平 - UPN 和主电子邮件地址不匹配会导致自动发现问题。

我遇到的问题是用户对象的“邮件”属性在更新用户时设置时也会抛出错误。

以下代码将成功更新用户:

User retrievedUser = new User();
List<IUser> retrievedUsers = null;
retrievedUsers = _activeDirectoryClient.Users
    .Where(searchUser => searchUser.ImmutableId.Equals(0k3otwAAEkm8vGSKbJqRZg==))
    .ExecuteAsync().Result.CurrentPage.ToList();
if (retrievedUsers != null && retrievedUsers.Count == 1)
{
    retrievedUser = (User)retrievedUsers.First();
        retrievedUser.UserPrincipalName = "someone1@somewhere.com";
        retrievedUser.UpdateAsync().Wait();
}

上述代码将更改用户的 UPN,但不会像添加新用户场景中那样更新主 SMTP 地址。这我不明白,因为它可能会导致自动发现问题(因为 UPN 与主 SMTP 地址不同)并否定在创建新用户时无法设置邮件地址的任何原因。

我找不到有关如何更新用户电子邮件地址或将其他电子邮件地址设置为主 SMTP 地址的任何详细信息。此要求的场景例如,当用户结婚并且他们希望有一个新的电子邮件地址作为他们的主要电子邮件地址时。

请问有人知道如何使用 Microsoft.Azure.ActiveDirectory.GraphClient 管理用户的主 SMTP 地址吗?我可以找到有关设置其他电子邮件地址的信息,但找不到有关如何更改主 SMTP 地址的信息。

感谢您的帮助!

【问题讨论】:

    标签: c# azure azure-ad-graph-api


    【解决方案1】:

    通过我自己的测试,通过 AzureAD Graph API 对userPrincipalName 的更新自动更新以下属性:

    • mail
    • userPrincipalName
    • proxyAddresses

    更新proxyAddresses 属性以将新的userPrincipalName 作为新的主 SMTP 地址,并保留旧的主地址,但不再是主地址。这也反映在 Exchange Online 中。以SMTP:(大写)为前缀的proxyAddress 是PrimarySmtpAddress。

    作为一种边缘情况,如果之前的主地址与之前的 UPN 相同,则不会发生此过程。如果 UPN 和 PrimarySmtpAddress 不匹配,则当通过 AzureAD Graph API 更新 UPN 时,new UPN 将作为 非主 地址添加,并且原始主地址仍将是主地址。

    据我所知,这种行为是无证的。但是,此处记录了类似的内容:https://support.microsoft.com/en-us/help/3190357/how-the-proxyaddresses-attribute-is-populated-in-azure-ad。似乎哪个属性确定 PrimarySmtpAddress 的优先级是mail > UPN > mailNickName

    一般来说,我认为直接操作 proxyAddresses 不是一个好主意,因为 Exchange/AD 已经为您做了很多。

    【讨论】:

      【解决方案2】:

      经过一个随机的想法,我想出了如何在上述场景中更改用户的主电子邮件地址。这是通过在用户的代理地址列表中设置主电子邮件地址来完成的,用“SMTP:”前缀表示主地址(注意它必须在 CAPS 中):

      retrievedUser.ProxyAddresses = new List<string>
      {
          "SMTP: someone1@somewhere.com"
      };
      

      希望这对其他人有帮助!

      【讨论】:

      • 这真的有效吗?根据文档msdn.microsoft.com/en-us/library/azure/ad/graph/api/…proxyAddresses 字段不可更新,当我自己尝试时,我得到Property 'proxyAddresses' is read-only and cannot be set. 据我所知,完成此操作的唯一方法是使用 Exchange Online cmdlet。另见social.msdn.microsoft.com/Forums/en-US/…
      • 我刚刚确认了@KevinSecrist 的担忧——它不起作用。正如预期的那样,我得到以下异常:Microsoft.Graph.ServiceException: Code: Request_BadRequest Message: Property 'proxyAddresses' is read-only and cannot be set.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多