1

通过一项服务,我可以从我们的 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中的日志或事件中获取更多详细信息?

4

1 回答 1

0

您应该使用 ClientCredentialsProvider https://docs.microsoft.com/en-us/graph/sdks/choose-authentication-providers?tabs=CS#client-credentials-provider

IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithTenantId(tenantID)
    .WithClientSecret(clientSecret)
    .Build();

ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);

请查看我们关于如何创建图形客户端的最新 SDK 文档 https://docs.microsoft.com/en-us/graph/sdks/create-client?tabs=CS

于 2019-07-26T18:10:48.237 回答