2017-12-12 14 views
1

Microsoft Graphのドキュメントでこのシナリオを見つけようとしましたが、見つけられませんでした。アプリケーションのアクセス許可を使用して受信トレイにアクセスしますか?

C#コンソールアプリケーションで.Net用のMicrosoft Graph Clientを使用しようとしています。アプリケーションは、ユーザーがサインインしなくても受信トレイを開き、メールを処理できるように電子メールをダウンロードする必要があります。

私は最初にアプリケーション認証でMSALを試しましたが、トークンを返すことはできませんでした。だから、私はOAuthとADALを試してみました。私はトークンを得て、グラフにアクセスしているようです。

しかし、私はアプリケーションとしてログインしています。したがって、ユーザーはなく、したがって受信トレイもありません。ユーザーのメールボックスを検索しようとしましたが、認証エラーが発生します。これは、受信ボックスの資格情報を入力する場所がないため、私には意味があります。

デーモンアプリをメールボックスにアクセスさせる方法を知っている人はいますか?

メールの下でpermissions scopes documentationに行くと、アクセス許可はDelegateになります。つまり、コンソールアプリケーションはメールボックスにアクセスできません。または、Delegateを使用してメールボックスにログインできますか?ログインポップアップボックスはありませんか?

私はAPPLICATIONID、メールボックス名([email protected]のようなもの)、およびADのユーザーの間でも混乱しています考えて

ここに私のコードです(例:myuser_IT。):

class AuthenticationHelper : IAuthenticationProvider 
{ 
    public async Task AuthenticateRequestAsync(HttpRequestMessage request) 
    { 
     string clientId = "xxxxx-xxxxx-xxxxx"; 
     string clientSecret = "yyYYyyYY"; //this is a secret. 

     try 
     { 
      AuthenticationContext authContext = 
       new AuthenticationContext("https://login.windows.net/mytenant.onmicrosoft.com/oauth2/token"); 

      ClientCredential creds = new ClientCredential(clientId, clientSecret); 

      AuthenticationResult authResult = 
       await authContext.AcquireTokenAsync("https://graph.microsoft.com/", creds); 

      request.Headers.Add("Authorization", "Bearer " + authResult.AccessToken); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 

public class InboxProcessor 
{ 
    public async Task DownloadEmails(string inbox) 
    { 
     try 
     { 
      IMailFolderMessagesCollectionPage inboxMessages = null; 

      GraphServiceClient graphClient = 
       new GraphServiceClient(new AuthenticationHelper()); 

      User myUser = await graphClient 
       .Users[inbox] 
       .Request() 
       .GetAsync(); //this give a permission error 

      // This is the example in all the examples. 
      // I'm not figuring out how to get to the correct users and how it know which Inbox. 
      // there's no way to log in as my user?  
      inboxMessages = await graphClient 
       .Users 
       .Request() 
       .Me 
       .MailFolders 
       .Inbox 
       .Messages 
       .Request() 
       .Top(20) 
       .GetAsync(); //this gives an error, I think because there's no ME 
     } 
     catch 
     { 
      //do some error handling 
     } 
    } 
} 

答えて

0

私はドン」ドキュメントの「委任権限のみを表示する」という意味に従ってください。これは正確ではありません。DelegatedApplicationの両方のアクセス許可が提供されています。

ユーザーのメールボックスを読むには、少なくともMail.Readの許可が必要です。ただし、メールボックスに変更を書き戻す必要がある場合は、Mail.ReadWriteが必要です。アプリケーションスコープを使用しているので、アプリケーションがメールボックスにアクセスする前に管理者同意も必要です。

アプリケーションを登録すると、アプリケーションID(別名clientId)が生成されます。

アプリケーションとしてメールボックスにアクセスすると、あなたが提供する必要がありますユーザーのiduserPrincipalName(通常<user>@<domain>または<user>@<domain>.onmicrosoft.com)。アプリケーションのみのコンテキスト内にユーザーが存在しないため、me参照は使用しません。

(これは User.Read.All許可範囲を必要とすることに注意してください)、それは次のようになり、マイクロソフトグラフからユーザーのプロファイル情報を取得するには:

User myUser = await graphClient 
    .Users["id or userPrincipalName"] 
    .Request() 
    .GetAsync(); 

が自分のメールボックスからユーザーの受信ボックスに戻るには、それは次のようになります:

var messages = await graphClient 
    .Users["id or userPrincipalName"] 
    .Messages 
    .Request() 
    .Top(20) 
    .GetAsync(); 
+0

マーク、ありがとうございました。あなたのコメントをこの記事や他の投稿に読んだら、ついに思いつきました:inboxMessages = graphClient.Users [userPrincipalName] .MailFolders.Inbox.Messages.Request()。GetAsync();を待ちます。これは機能しています。たぶん私はusers.Read.Allアクセス許可のスコープを持っていないと特定のユーザーにのみ?私は.Top(20)を追加しようとしています。それ以外の場合は多すぎるかもしれません。ありがとうございました。ありがとうございました。 – Laurie996

+0

また、私は今気づいています...デリゲート権限をスクロールしてアプリケーション権限を表示する必要があります。ありがとうございました! – Laurie996

+0

これは認証を行う良い方法だと思いますか?そこにはたくさんの異なる例があるようです。私はシンプルなのが好きで、これは私にはやさしいようでした。 – Laurie996

関連する問題