我一直关注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确实提到了客户同意流程,但该部分的详细信息并不清楚。我是否可以不向所有人提供我的应用程序许可,而不会在最初提示他们同意。
答案 0 :(得分:2)
它正在我这边工作,请先确认您已将使用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);
这将在目标帐户的收件箱中创建一个新文件夹。
答案 1 :(得分:0)
我有一个使用几乎相同代码的工作解决方案。
我能确定的唯一区别是身份验证上下文网址,即https://login.microsoftonline.com/*tenant-id*
。
另外,我使用new ImpersonatedUserId(ConnectingIdType.SmtpAddress, email);
您确定me@email.com是完整的登录名,还是只是电子邮件地址?