【问题标题】:Azure AD app-only access tokens for exchange impersonation用于交换模拟的仅限 Azure AD 应用的访问令牌
【发布时间】:2017-02-27 16:44:41
【问题描述】:

我一直在关注 this resource 在 azure 上创建一个应用程序,该应用程序使用 azure 活动目录对自身进行身份验证。我们希望使用来自此身份验证交互的令牌与 Exchange 和 EWS 托管 API 来模拟我们组织中的每个人,而无需他们登录。

我已在 azure 上向我们的组织注册了一个应用,并允许它进行交换。创建证书并使用它设置我们的 azure 应用程序后,我可以通过以下代码使用 ADAL 获取仅限应用程序的访问令牌...

string authority = "https://login.windows.net/{tenant}/oauth2/authorize";
AuthenticationContext authenticationContext = new AuthenticationContext(authority, false);
var certPath = @"C:\path\to\cert\Cert.pfx";
var certfile = System.IO.File.OpenRead(certPath);
var certificateBytes = new byte[certfile.Length];
certfile.Read(certificateBytes, 0, (int)certfile.Length);
var cert = new X509Certificate2(
    certificateBytes,
    PRIVATE_KEY_PASSWORD,
    X509KeyStorageFlags.Exportable |
    X509KeyStorageFlags.MachineKeySet |
    X509KeyStorageFlags.PersistKeySet);

ClientAssertionCertificate cac = new ClientAssertionCertificate(CLIENT_ID, cert);

var token = await authenticationContext.AcquireTokenAsync("https://outlook.office365.com/", cac);

使用此令牌,与 Ews 托管 API 交互的代码如下所示..

ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;
_ExchangeService = new ExchangeService(ExchangeVersion.Exchange2013_SP1) {
    Credentials = new OAuthCredentials(token),
    Url = new Uri("https://outlook.office365.com/ews/exchange.asmx"),
    ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.PrincipalName, "me@email.com"),
};

_ExchangeService.HttpHeaders.Add("X-AnchorMailbox", "me@email.com");

这似乎是通过托管 api 设置模拟的正确方法,尽管每个请求都会返回 401 未经授权的错误。

我的问题归结为,我在这里做错了吗?或者我还需要做些什么来让我的应用程序访问交换服务器?

我关注的article 确实提到了客户同意流程,但该部分的详细信息尚不清楚。我可以在不提示他们同意的情况下向所有人授予我的应用程序权限吗?

【问题讨论】:

    标签: azure office365 exchangewebservices adal


    【解决方案1】:

    它在我这边工作,请首先确认您已为您的应用设置使用 Exchange Web 服务并具有对所有邮箱的完全访问权限应用权限,以便 Office 365 Exchange Online受 Azure AD 保护: 对于测试,您可以尝试以下代码:

            ExchangeService exchangeService = new ExchangeService(ExchangeVersion.Exchange2013);
            exchangeService.Url = new Uri("https://outlook.office365.com/ews/exchange.asmx");
            exchangeService.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "sp.tech@o365e3w15.onmicrosoft.com");
            exchangeService.HttpHeaders.Add("X-AnchorMailbox", "sp.tech@o365e3w15.onmicrosoft.com");
            exchangeService.TraceEnabled = true;
            exchangeService.TraceFlags = TraceFlags.All;
            exchangeService.Credentials = new OAuthCredentials(token.AccessToken);
            Folder newFolder = new Folder(exchangeService);
            newFolder.DisplayName = "TestFolder";
    
            newFolder.Save(WellKnownFolderName.Inbox);
    

    这将在目标帐户的收件箱中创建一个新文件夹。

    【讨论】:

    • 这正是我所需要的。我刚刚忘记申请申请许可。感谢您的帮助。
    • 嗨,我在这里遇到了同样的 401 错误:stackoverflow.com/questions/45614307/… 我在 azure 门户上为我的应用授予了所需的权限,但仍然没有运气。
    【解决方案2】:

    我有一个使用几乎相同代码的有效解决方案。

    我能确定的唯一区别是身份验证上下文 URL,即 https://login.microsoftonline.com/*tenant-id*

    另外,我使用new ImpersonatedUserId(ConnectingIdType.SmtpAddress, email);

    您确定 me@email.com 是完整的登录名,还是只是电子邮件地址?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      相关资源
      最近更新 更多