0

Ich habe Probleme, meiner Anwendung die Berechtigungen zu geben, die für den Zugriff auf einen anderen Benutzer in den E-Mail-Nachrichten der Organisation erforderlich sind. Ich musste meinem Administrator alle möglichen Berechtigungen über das Azure-Portal erteilen und erhalte den Fehler "Zugriff verweigert" in der Testanwendung, die ich von der Graph-Website heruntergeladen habe. Das lässt mich denken, dass ich nicht den richtigen Aufruf der API verwende.Wie kann ich mit Microsoft Graph in einer MVC-App auf die Ressourcen eines anderen Benutzers (insbesondere E-Mails) zugreifen?

Hier ist der Code, den ich mit einer anderen E-Mail des Benutzers abzurufen:

IMailFolderMessagesCollectionPage messages = await graphClient.Users["userID"].MailFolders.Inbox.Messages.Request().Top(25).GetAsync(); 

wo „userID“ ist die ID-Wert ich davon ab, alle Benutzer in meiner Organisation durch den Graphen-Explorer erhalten.

Voll Code:

(Controller)

[Authorize] 
public async Task<ActionResult> GetEmails() 
     { 
     try 
     { 
      // Initialize the GraphServiceClient. 
      GraphServiceClient graphClient = SDKHelper.GetAuthenticatedClient(); 

      ResultsViewModel results = new ResultsViewModel(); 
      // Get the messages. 
      results.Items = await graphService.GetMyInboxMessages(graphClient); 
      return View("Graph", results); 
     } 
     catch (ServiceException se) 
     { 
      if (se.Error.Code == Resource.Error_AuthChallengeNeeded) return new EmptyResult(); 
      return RedirectToAction("Index", "Error", new { message = Resource.Error_Message + Request.RawUrl + ": " + se.Error.Message }); 
     } 
    } 

(graphService.cs)

public async Task<List<ResultsItem>> GetMyInboxMessages(GraphServiceClient graphClient) 
    { 
     List<ResultsItem> items = new List<ResultsItem>(); 

     // Get messages in the Inbox folder. 
     //IMailFolderMessagesCollectionPage messages = await graphClient.Me.MailFolders.Inbox.Messages.Request().GetAsync(); 
     IMailFolderMessagesCollectionPage messages = await graphClient.Users["e87151ce-093b-4820-a98c-4cef247ed2be"].MailFolders.Inbox.Messages.Request().Top(25).GetAsync(); 

     string recipients = string.Empty; 
     if (messages?.Count > 0) 
     { 
      foreach (Message message in messages) 
      { 
       //foreach (Recipient recipient in message.ToRecipients)      
       for (int i = 0; i < message.ToRecipients.Count(); i++) 
        recipients += ((i != 0 ? "; " : "") + message.ToRecipients.ElementAt(i).EmailAddress.Address.ToString()); 

       items.Add(new ResultsItem 
       { 
        Type = "message", 
        SentDateTime = message.SentDateTime.Value.DateTime.ToLocalTime(), 
        Subject = message.Subject, 
        From = message.From.EmailAddress.Address.ToString(), 
        To = recipients, 
        Id = message.Id, 
        Body = message.Body.Content.ToString() 
       }); 
      } 
     } 
     return items; 
    } 

Ist dies eine falsche GET-Anfrage? Oder ist es ein Berechtigungsproblem?

Vielen Dank im Voraus für Ihre Hilfe.

+0

Können Sie die Ansprüche in Ihrem Token teilen? Sie können eine [Website wie diese] (http://jwt.calebb.net/) verwenden, um Ihr Token zu dekodieren. –

Antwort

1

Sie können ein App-Only-Token anfordern (Clientberechtigungsfluss), indem Sie die Anwendungsberechtigungen Read mail in all mailboxes für den Zugriff auf Microsoft Graph verwenden. Nach Ihrer Beschreibung, registrieren Sie Anwendung in azur Portal (azur ad v1.0), könnten Sie unter Schritte versuchen:

  1. Read mail in all mailboxes Anwendungsberechtigungen für Microsoft Graph API-Satz: enter image description here

  2. fragen Sie Ihren admin, um Berechtigungen für alle Konten im aktuellen Verzeichnis zu gewähren (Zustimmung des Administrators für die Anwendung), indem Sie auf die Schaltfläche Grant Permissions klicken, wie im obigen Screenshot gezeigt.

  3. Verwenden Client Credential Fluss erwerben App nur Token ADAL Bibliothek: 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) 
         { 
         } 
        } 
    } 
    

    , wenn Sie Ihren Token entschlüsseln, werden Sie Mail.Read App Erlaubnis in roles Anspruch finden.

  4. Dann könnten Sie Microsoft Graph-Client-Bibliothek verwenden Mails von Benutzern zu erhalten:

    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(); 
    
  5. Das Ergebnis: enter image description here

+0

Vielen Dank, das ist genau das, was ich brauchte :) –

Verwandte Themen