【发布时间】: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