通过一项服务,我可以从我们的 Azure 租户中获取用户列表,但我无法为服务应用授予正确的权限,以便将消息读取到共享邮箱。以下代码是代码的精简版本,用户 ID 是与共享邮箱的用户帐户关联的 guid。
private const string AuthorityFormat = "https://login.microsoftonline.com/{0}/v2.0";
private const string GraphScopeDefault = "https://graph.microsoft.com/.default";
private const string GraphUrl = "https://graph.microsoft.com/v1.0";
private const string RedirectUri = "https://login.microsoftonline.com/common/oauth2/nativeclient";
public static async Task GetMailAsync(string tenantId, string clientId, string clientSecret, string redirectUri, string userId ) {
var daemonClient = ConfidentialClientApplicationBuilder.Create(clientId)
.WithAuthority(string.Format(AuthorityFormat, tenantId))
.WithRedirectUri(redirectUri)
.WithClientSecret(clientSecret)
.Build();
var authResult = await daemonClient.AcquireTokenForClient(new[] {GraphScopeDefault}).ExecuteAsync();
async Task AuthenticateRequestAsyncDelegate(HttpRequestMessage requestMessage) => requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", authResult.AccessToken);
var graphClient = new GraphServiceClient(GraphUrl,new DelegateAuthenticationProvider(AuthenticateRequestAsyncDelegate));
var messages = await graphClient
.Users[userId]
.Messages
.Request()
.GetAsync();
}
这是产生的错误: Microsoft.Graph.ServiceException:'代码:ErrorAccessDenied 消息:访问被拒绝。检查凭据并重试。
我已通过 Exchange Powershell 脚本确认 App-Id 有权访问此邮箱:
Test-ApplicationAccessPolicy -Identity sharedmailbox@foo.bar -AppId {appId guid}
带有以下响应:AccessCheckResult : 已授予
授予的 API 权限,是的,它们已被管理员批准:
调用用户 api 的相同代码有效:
var userPage = await graphClient.Users.Request().GetAsync();
知道可能是什么问题吗?Azure App Portal 中是否有任何日志可以告诉我尝试失败时可能出现的问题?
提前致谢!
acg
***** 更新 *****
问题是特定于邮箱的,无论是使用我的代码还是 Jeremy 的代码,在我们的一个共享邮箱中都会出现相同的错误,但在另一个共享邮箱中却可以正常工作。两个邮箱都显示权限是通过powershell命令授予的,有什么方法可以从Azure中的日志或事件中获取更多详细信息?