Azure AD仅限应用程序访问令牌以进行交换模拟

时间:2017-02-27 16:44:42

标签: azure office365 exchangewebservices adal

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

我已经在我们的组织上注册了一个应用程序,并允许交换。创建证书并使用它设置我们的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未经授权的错误。

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

我跟随的article确实提到了客户同意流程,但该部分的详细信息并不清楚。我是否可以不向所有人提供我的应用程序许可,而不会在最初提示他们同意。

2 个答案:

答案 0 :(得分:2)

它正在我这边工作,请先确认您已将使用Exchange Web服务以及 Office 365 Exchange Online 的所有邮箱应用程序权限设置为您的应用程序受Azure AD保护的: enter image description here 对于测试,您可以尝试下面的代码:

        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);

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

答案 1 :(得分:0)

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

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

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

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