使用应用程序权限访问收件箱?

时间:2017-12-12 22:55:41

标签: microsoft-graph

我尝试在Microsoft Graph文档中找到此方案,但我从未找到过。

我正在尝试在我的C#控制台应用程序中使用Microsoft Graph Client for .Net。该应用程序需要在没有用户登录的情况下打开收件箱并下载电子邮件,以便它们可以处理它们。

我首先尝试使用应用程序身份验证进行MSAL,但我永远无法获得令牌。所以,我尝试使用OAuth和ADAL,看起来我正在获取令牌并访问图表。

但是,我以应用程序身份登录...因此,没有用户,因此没有收件箱。我试图查找用户邮箱,但是我收到了身份验证错误。这对我来说很有意义,因为没有地方可以输入收件箱凭据。

有谁知道如何让守护程序应用程序访问邮箱?

如果您使用Mail下的permissions scopes documentation,则只显示Delegate权限。那么,这是否意味着控制台应用无法访问邮箱?或者,我可以使用Delegate登录邮箱但没有登录弹出框吗?

我认为我在ApplicationId,邮箱名称(类似myuser@microsoft.com)和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
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我不遵循文档中的“它只显示委派权限”的含义。这不准确,提供了DelegatedApplication权限。

要阅读用户的邮箱,您至少需要Mail.Read个权限。但是,如果您需要将更改写回邮箱,则需要Mail.ReadWrite。由于您正在使用应用程序范围,因此在应用程序可以访问邮箱之前,您还需要管理员同意。

您注册申请时会生成您的申请ID(又名clientId)。

作为应用程序访问邮箱时,您需要提供用户的iduserPrincipalName(通常为<user>@<domain><user>@<domain>.onmicrosoft.com)。您永远不会使用me引用,因为在仅应用程序上下文中没有用户。

要从Microsoft Graph获取用户的个人资料信息,它将如下所示(请注意,这需要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();