Azure AD app仅访问用于exchange模拟的令牌

Azure AD app仅访问用于exchange模拟的令牌,azure,office365,exchangewebservices,adal,Azure,Office365,Exchangewebservices,Adal,我一直在关注如何在azure上创建一个应用程序,该应用程序使用azure active directory对自身进行身份验证。我们希望使用来自与exchange和EWS管理API的此身份验证交互的令牌来模拟我们组织中的每个人,而无需他们登录 我已在azure上向我们的组织注册了一个应用程序,并授予其交换权限。在创建证书并使用它设置azure应用程序后,我可以通过以下代码使用ADAL获取仅应用程序访问令牌 string authority = "https://login.windows.net/

我一直在关注如何在azure上创建一个应用程序,该应用程序使用azure active directory对自身进行身份验证。我们希望使用来自与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设置模拟的正确方法,尽管每个请求都返回一个错误

我的问题归根结底是,我在这里做错什么了吗?或者,我是否需要执行其他操作来授予我的应用程序对exchange服务器的访问权限


我所关注的内容确实提到了客户同意流程,但该部分的细节并不清楚。我不能在没有提示他们最初同意的情况下为每个人授予我的应用程序许可

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

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

另外,我使用
新的模拟用户ID(ConnectingIdType.SmtpAddress,email)


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

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

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

另外,我使用
新的模拟用户ID(ConnectingIdType.SmtpAddress,email)


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

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

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

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

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

        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错误:我在azure portal上为我的应用程序授予了所需的权限,但仍然没有成功。这正是我所需要的。我刚刚忘了申请许可。谢谢你的帮助。嗨,我在这里面临同样的401错误:我在azure portal上为我的应用程序授予了所需的权限,但仍然没有成功。