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}。
'''
我已经为具有 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}。
'''