Mic*_*elZ 3 c# ms-office exchangewebservices oauth-2.0
我正在尝试使用 OAuth 和 EWS 托管 API 登录 Office 365 Exchange Online。
我能够使用连接到 Office 365 Web API (REST),因此我确实拥有来自 Active Directory 身份验证库 (ADAL) 的有效令牌。
现在,我正在尝试使用 EWS 和 TokenCredentials 进行连接。
代码很简单,我认为:
public static ExchangeService ConnectToServiceWithImpersonation(string token)
{
var service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
if (true)
{
service.TraceListener = new TraceListener();
service.TraceFlags = TraceFlags.All;
service.TraceEnabled = true;
}
var credentials = new TokenCredentials(token);
service.Credentials = credentials;
service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
return service;
}
Run Code Online (Sandbox Code Playgroud)
令牌由 ADAL 生成,而 ADAL 又来自使用“Office 365 API 工具 - 预览”的示例代码
// Obtain information for communicating with the service:
Office365ServiceInfo serviceInfo = Office365ServiceInfo.GetExchangeServiceInfo();
if (!serviceInfo.HasValidAccessToken)
{
return Redirect(serviceInfo.GetAuthorizationUrl(Request.Url));
}
// Connect to Exchange
var service = ConnectToServiceWithImpersonation(serviceInfo.AccessToken);
Folder inbox = Folder.Bind(service, WellKnownFolderName.Inbox);
Run Code Online (Sandbox Code Playgroud)
在 Folder.Bind 调用中,我收到 401 Unauthorized 错误。EWS 跟踪给了我这个:
2014-04-06 12:06:39.2012 TRACE ExchangeWebServices: EwsResponseHttpHeaders -> <Trace Tag="EwsResponseHttpHeaders" Tid="11" Time="2014-04-06 10:06:39Z">
HTTP/1.1 401 Unauthorized
request-id: 01ba1ca9-2850-480a-9d65-ec55bfef8657
X-CasErrorCode: BadSamlToken
X-FEServer: AMSPR04CA018
Content-Length: 0
Cache-Control: private
Date: Sun, 06 Apr 2014 10:06:39 GMT
Server: Microsoft-IIS/7.5
WWW-Authenticate: Basic Realm=""
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Run Code Online (Sandbox Code Playgroud)
不幸的是,数小时的谷歌搜索并没有真正帮助,似乎没有关于 EWS 和 OAuth 身份验证的非常具体的信息,而且我不知道如何进一步解决它,所以我希望任何人都对如何进行一些建议让它工作。
TokenCredentials 不是在此示例中使用的正确类。就像杰森提到的其他原因。请注意并澄清使用此令牌和/或 SAML 令牌在带有 EWS 的 Exchange Online 中不起作用。仅支持基于 OAuth 的访问。为了完成这项工作,我们在 EWS 托管 API 中放置了一个 OAuthCredentials 类。在您的代码中,您可以“var credentials = new OAuthCredentials(token)”。请注意,EWS Soap 仅支持完全“user_impersonation”/“对用户邮箱的完全访问”权限。Calendar.Read 等粒度权限仅适用于 EWS Rest API。虽然“完全邮箱访问”需要管理员同意,但其他租户的管理员可以同意,因为它是一个 Web 应用程序。如果您想开发本机应用程序,