我正在尝试使用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;
}
令牌由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);
在Folder.Bind调用中,我收到401 Unauthorized错误。 EWS Trace给了我这个:
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
不幸的是,几小时的谷歌搜索没有真正帮助,似乎没有关于EWS和OAuth身份验证的具体信息,我不知道如何进一步解决它,所以我希望任何人都有一些建议如何让它运作。
答案 0 :(得分:4)
TokenCredentials不是在此示例中使用的正确类。就像杰森提到的那样,出于其他原因。作为注释并澄清使用此和/或SAML令牌将无法在Exchange Online中使用EWS。仅支持基于OAuth的访问。为了完成这项工作,我们在EWS托管API中添加了OAuthCredentials类。在您的代码中,您可以“var credentials = new OAuthCredentials(token)”。请注意,EWS Soap仅支持完整的“user_impersonation”/“对用户邮箱的完全访问权限”权限。 Calendar.Read等详细权限仅适用于EWS Rest API。虽然“完全邮箱访问”需要管理员同意,但其他租户的管理员可以同意,因为它是一个Web应用程序。如果您想开发本机应用程序,该应用程序必须直接在其运行的租户的应用程序中注册才能使用“完全邮箱访问”。
答案 1 :(得分:2)
您可以使用OAuth连接到EWS(而不是REST),但是,它并不顺畅。 EWS需要特殊的&#34;完全访问用户的邮箱&#34; Azure Active Directory中的委派权限,需要管理员进行注册。此许可也没有“旅行”#34;在组织外部,因此EWS没有用户同意的方案。从本质上讲,唯一可行的方案是管理员为您自己的组织注册应用程序。
检查您在Azure中的应用注册,并确保已分配该权限。
假设您已获得许可,我已经以两种方式完成了这项工作。
最简单的方法:只需将您获得的令牌添加到Authorization标头中的请求标头中,如下所示:
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
string accessToken = GetAccessToken();
if (!string.IsNullOrEmpty(accessToken))
service.HttpHeaders.Add("Authorization", "Bearer " + accessToken);
答案 2 :(得分:0)
如果来自aad的认证域,您可以使用saml,并使用ms online sts交换该令牌。我做到了这一点,并且很容易在网上找到我的文章。
有兴趣全部转储,现在使用aad问题访问令牌。
旧版本在某些方面很可爱,因为你没有依赖于aad oauth,对于你自己的应用程序,只是在与微软属性交谈时与aad land绑在一起。如果有一个使用openid connect的供应商移动令牌(tgt,除了名称之外),也许我可以忍受一些依赖性。
所以我有一个aad(netmagic.onmicrosoft.com),带有认证域名注册(rapmlsqa.com)。我是否可以在aad中创建一个webapi类应用程序,分配办公室权限?