EWS 对多个租户使用 OAUth(仅限应用程序)抛出 Access is denied /401 unauthorized on EmailMessage.Bind()

EWS using OAUth (app only) for multiple tenants throwing Access is denied /401 unauthorised on EmailMessage.Bind()

我已经为具有 Azure 和 Exchange 365 权限的 OAuth 注册了一个应用程序 (full-access-as-app)。

当我尝试从我的网络应用程序访问 EmailMessage.Bind(service, fixedId, propertySet) 时,它会抛出此错误。

Microsoft.Exchange.WebServices.Data.ServiceResponseException: 访问被拒绝。检查凭据并重试。,进程未能获得正确的属性。

在所有管理员同意的情况下,也尝试提供明确的权限(日历、联系人、电子邮件设置)。

虽然我可以发送电子邮件和创建任务。

我遗漏了什么吗?如果有任何帮助,我将不胜感激。

谢谢, AK

更新:

我正在使用以下代码和应用程​​序注册(仅限应用程序):https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-authenticate-an-ews-application-by-using-oauth

我有 2 个租户 A 和 B,注册应用程序的租户 A 的帐户没有问题,但租户 B 的帐户失败并出现此错误:SMTP 地址没有与之关联的邮箱。

两个租户的同意和权限设置为:
允许用户同意应用程序

属性 集合是这样创建的:


    var propertySet = new 
    PropertySet(BasePropertySet.FirstClassProperties);
                if (!string.IsNullOrWhiteSpace(propertyName))
                {
                    var extendedPropertyDefinition = new 
    ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, 
   propertyName, MapiPropertyType.String);
                    propertySet.Add(extendedPropertyDefinition);
                }
                else
                {
                    propertySet.Add(new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, PersonIdPropertyName, MapiPropertyType.String));
                    propertySet.Add(new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, PersonDataPropertyName, MapiPropertyType.String));
                    propertySet.Add(new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, PersonContextPropertyName, MapiPropertyType.String));
                }

回答我的问题。

问题 1:“未经授权的 401 错误”是由于未在消费者租户目录中授予管理员同意。

问题 2:“SMTP 地址没有与之关联的邮箱”是由于在不同租户中注册的 OAuth(在多租户的情况下)

如果 Auth 应用程序由多个租户提供服务,那么您需要注意两件事:

1: 支持的帐户应该是:任何组织目录中的帐户(任何 Azure AD 目录 - 多租户)和个人 Microsoft 帐户(例如 Skype、Xbox),同时注册 auth 应用程序。

2: 构建应用程序生成器 ''' var cca = ConfidentialClientApplicationBuilder .Create(appId) .WithAuthority("https://login.microsoftonline.com/{消费者的租户id}") .WithClientSecret(客户端密码) .Build();

而不是

var cca = ConfidentialClientApplicationBuilder .Create(appId) .WithClientSecret(客户端密码) .WithTenantId(tenantId) .Build();

例如:

如果auth应用程序在A中注册,并且您想在租户B中验证office365帐户,则租户B中的管理员应使用租户B的link https://login.microsoftonline.com/{tennatid授予管理员同意应用程序}/adminconsent?client_id={auth app的clientid} 并在创建应用程序构建器时使用权限作为“https://login.microsoftonline.com/{tenant id tenant B}。

'''