Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何访问其他用户';在MVC应用程序中使用Microsoft Graph的资源(特别是电子邮件)?_C#_Asp.net Mvc_Azure_Azure Active Directory_Microsoft Graph Api - Fatal编程技术网

C# 如何访问其他用户';在MVC应用程序中使用Microsoft Graph的资源(特别是电子邮件)?

C# 如何访问其他用户';在MVC应用程序中使用Microsoft Graph的资源(特别是电子邮件)?,c#,asp.net-mvc,azure,azure-active-directory,microsoft-graph-api,C#,Asp.net Mvc,Azure,Azure Active Directory,Microsoft Graph Api,我似乎在授予我的应用程序访问oranization电子邮件中其他用户所需的权限时遇到问题。我让我的管理员通过Azure门户授予我的应用程序所有可能的权限,我从Graph网站下载的测试应用程序中出现“访问被拒绝”错误。这让我觉得可能我没有使用正确的API调用 以下是我用来检索其他用户电子邮件的代码: IMailFolderMessagesCollectionPage messages = await graphClient.Users["userID"].MailFolders.Inbox.Mes

我似乎在授予我的应用程序访问oranization电子邮件中其他用户所需的权限时遇到问题。我让我的管理员通过Azure门户授予我的应用程序所有可能的权限,我从Graph网站下载的测试应用程序中出现“访问被拒绝”错误。这让我觉得可能我没有使用正确的API调用

以下是我用来检索其他用户电子邮件的代码:

IMailFolderMessagesCollectionPage messages = await graphClient.Users["userID"].MailFolders.Inbox.Messages.Request().Top(25).GetAsync();
其中“userID”是我通过图形浏览器获取组织中所有用户的id值

完整代码:

(控制员)

[授权]
公共异步任务GetEmails()
{
尝试
{
//初始化GraphServiceClient。
GraphServiceClient graphClient=SDKHelper.GetAuthenticatedClient();
ResultsViewModel结果=新的ResultsViewModel();
//获取消息。
results.Items=wait graphService.GetMyInboxMessages(graphClient);
返回视图(“图形”,结果);
}
捕获(ServiceException se)
{
if(se.Error.Code==Resource.Error_authChallengeEded)返回新的EmptyResult();
返回RedirectToAction(“Index”,“Error”,new{message=Resource.Error\u message+Request.RawUrl+”:“+se.Error.message});
}
}
(graphService.cs)

公共异步任务GetMyInboxMessages(GraphServiceClient graphClient)
{
列表项=新列表();
//获取收件箱文件夹中的邮件。
//IMailFolderMessagesCollectionPage messages=Wait graphClient.Me.MailFolders.Inbox.messages.Request().GetAsync();
IMAILFOLDEMessagesCollectionPage messages=await graphClient.Users[“e87151ce-093b-4820-a98c-4cef247ed2be”]。MailFolders.Inbox.messages.Request().Top(25).GetAsync();
string recipients=string.Empty;
如果(消息?.Count>0)
{
foreach(消息中的消息)
{
//foreach(message.ToRecipients中的收件人)
for(int i=0;i
这是一个错误的GET请求吗?还是权限问题


提前感谢你的帮助

您可以使用
读取所有邮箱中的邮件
应用程序权限请求仅应用程序令牌(客户端凭据流),以访问Microsoft Graph。根据您的描述,您在azure portal(azure ad v1.0)中注册应用程序,您可以尝试以下步骤:

  • 设置microsoft graph api的
    在所有邮箱中读取邮件
    应用程序权限:
    

  • 通过单击
    授予权限
    按钮,要求您的管理员为当前目录中的所有帐户授予权限(对应用程序权限进行管理员同意),如上图所示

  • 使用客户端凭据流使用ADAL库获取仅应用程序令牌: AzureAuthenticationProvider.cs:

    public class AzureAuthenticationProvider : IAuthenticationProvider
    {
        private string _azureDomain = "xxxx.onmicrosoft.com";
    
        public async Task AuthenticateRequestAsync(HttpRequestMessage request)
        {
          try
          {
            string clientId = "xxxxx-xxxx-xxxx-xxxx-xxxxxxxx";
            string clientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
    
            AuthenticationContext authContext = new AuthenticationContext("https://login.windows.net/" + _azureDomain + "/oauth2/token");
    
            ClientCredential credentials = new ClientCredential(clientId, clientSecret);
    
            AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://graph.microsoft.com/", credentials);
    
            request.Headers.Add("Authorization", "Bearer " + authResult.AccessToken);
          }
          catch (Exception ex)
          {
          }
        }
    }
    
    如果您解码您的令牌,您将在
    角色
    声明中找到
    Mail.Read
    应用权限

  • 然后,您可以使用Microsoft graph client library获取用户的邮件:

        GraphServiceClient graphClient = new GraphServiceClient(new AzureAuthenticationProvider());
    
        //List<ResultsItem> items = new List<ResultsItem>();           
        IMailFolderMessagesCollectionPage messages = await graphClient.Users["77cac441-8279-452e-8904-ff24ddf5c715"].MailFolders.Inbox.Messages.Request().Top(25).GetAsync();
    
    GraphServiceClient-graphClient=new-GraphServiceClient(new-AzureAuthenticationProvider());
    //列表项=新列表();
    IMailFolderMessagesCollectionPage messages=Wait graphClient.Users[“77cac441-8279-452e-8904-ff24ddf5c715”]。MailFolders.Inbox.messages.Request();
    
  • 结果是:


  • 您可以在您的代币内共享这些声明吗?您可以使用解码令牌。我缺少的密钥是
    用户[]
    ,您可以继续为
    用户[]执行此操作。消息[]
    ,等等……我真希望他们在SDK文档中给出此示例。谢谢
    public class AzureAuthenticationProvider : IAuthenticationProvider
    {
        private string _azureDomain = "xxxx.onmicrosoft.com";
    
        public async Task AuthenticateRequestAsync(HttpRequestMessage request)
        {
          try
          {
            string clientId = "xxxxx-xxxx-xxxx-xxxx-xxxxxxxx";
            string clientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
    
            AuthenticationContext authContext = new AuthenticationContext("https://login.windows.net/" + _azureDomain + "/oauth2/token");
    
            ClientCredential credentials = new ClientCredential(clientId, clientSecret);
    
            AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://graph.microsoft.com/", credentials);
    
            request.Headers.Add("Authorization", "Bearer " + authResult.AccessToken);
          }
          catch (Exception ex)
          {
          }
        }
    }
    
        GraphServiceClient graphClient = new GraphServiceClient(new AzureAuthenticationProvider());
    
        //List<ResultsItem> items = new List<ResultsItem>();           
        IMailFolderMessagesCollectionPage messages = await graphClient.Users["77cac441-8279-452e-8904-ff24ddf5c715"].MailFolders.Inbox.Messages.Request().Top(25).GetAsync();