我们尝试使用 Microsoft Graph 设置最简单的应用程序,用于从我们组织的邮箱中读取电子邮件。
它是后台服务,因此我们使用 ClientSecretCredential 作为身份验证策略。
这是代码:
var credentials = new ClientSecretCredential("xxx-tenantID","xxx-clientId","xxx-clientSecret");
var graphServiceClient = new GraphServiceClient(credentials, new string [] {"https://graph.microsoft.com/.default"});
var result = await graphServiceClient.Users["<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dcb1a5bdb8b8aeb9afaf9cb1a5bfb3b1acbdb2a5f2bfb3b1" rel="noreferrer noopener nofollow">[email protected]</a>"].MailFolders["Inbox"] .Messages.Request() .GetAsync();
似乎登录正确,但在尝试访问特定收件箱时却被拒绝:
Unhandled exception. Status Code: Forbidden
Microsoft.Graph.ServiceException: Code: ErrorAccessDenied
Message: Access is denied. Check credentials and try again.
我认为我们错过了 azure 方面的一些授权;特别是,我们找不到授权应用程序访问该特定邮箱的位置 ( [email protected] )。
更新:
当我们向应用程序授予如下所示的授权时,它就可以工作。
不幸的是,这允许访问组织中的所有邮箱,这是 Not Acceptable ,因为此应用程序应该只访问它旨在管理的服务邮箱。
现在的问题是如何限制对唯一需要的邮箱的访问。
最佳答案
总而言之,您想使用客户端凭据访问单个邮箱吗?
您可以使用此 powershell 命令创建访问策略,以将此应用程序限制为单个邮箱或一组邮箱。
https://learn.microsoft.com/en-us/powershell/module/exchange/new-applicationaccesspolicy
Connect-ExchangeOnline
New-ApplicationAccessPolicy -AccessRight RestrictAccess -AppId <String[]> -PolicyScopeGroupId <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c6bfa9b3b4e8b5a3b4b0afa5a386a7a5a5a9b3a8b2e8a5a9ab" rel="noreferrer noopener nofollow">[email protected]</a>
关于c# - 使用客户端 key 的 Azure 和 Microsoft Graph : Access denied accessing inbox,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73222395/