如何自动化 IMAP Office 365 访问

问题描述 投票:0回答:1

希望您能提供帮助,因为我似乎很难理解 oAuth2 和 Office 365 的身份验证选项。

我想要创建的系统是一个自动化过程,每小时(作为示例)检查我的 Office 365 邮箱中特定文件夹中是否有新邮件。 这听起来很容易,因为我可以使用 MailKit 进行邮箱操作,但是我正在努力制定身份验证过程/选项。

当涉及到 Microsoft.Identity.Client 时,我似乎有 2 个选择:

  • 公共客户端应用程序生成器
  • ConfidentialClientApplicationBuilder

我了解 PublicClientApplicationBuilder 让用户通过浏览器进行身份验证并返回一个令牌,我认为我可以存储该令牌以便每次重复使用。 然而,令牌似乎很快就会过期,因此不确定这是否有效。

这是我的 PublicClientApplicationBuilder 的测试代码:

var app = PublicClientApplicationBuilder
    .Create(clientId)
    .WithTenantId(tenantId)
    .WithRedirectUri("http://localhost")
    .Build();

var accounts = app.GetAccountsAsync().Result;

var scopes = new[]
{
    "User.Read",
    "https://graph.microsoft.com/IMAP.AccessAsUser.All",
};

var token = app.AcquireTokenInteractive(scopes).ExecuteAsync().Result;

根据我所读到的内容,我确实需要使用 ConfidentialClientApplicationBuilder,但我不知道如何返回用户特定的令牌。

有人设法做到这一点还是我应该使用 PublicClient 令牌?

提前致谢

c# azure office365 azure-ad-msal
1个回答
0
投票

根据您的要求

ConfidentialClientApplicationBuilder
适合您的要求。

如果您想获取涉及用户交互的用户特定访问令牌,那么您必须利用

PublicClientApplicationBuilder
流。

但是令牌似乎很快就会过期,因此不确定这是否有效。

  • 根据您的要求,您可以延长令牌的寿命。参考这个MsDoc

否则,您可以使用

acquiretokensilent
,它首先检查浏览器存储中的缓存以查看是否存在未过期的访问令牌并返回它。如果未找到访问令牌或找到的访问令牌已过期,它将尝试使用其刷新令牌来获取新的访问令牌。

  • AcquireTokenSilent
    重用令牌的方法,无需每次都提示用户。 -从用户令牌缓存中获取
    account
    的访问令牌。
using Microsoft.Identity.Client;

class Program
{
    private const string clientId = "ClientID";
    private const string tenantId = "TenantID";
    private const string redirectUri = "http://localhost"; 
    private static readonly string[] scopes = {
        "User.Read",
        "https://graph.microsoft.com/IMAP.AccessAsUser.All"
    };

    static async Task Main(string[] args)
    {
        var app = PublicClientApplicationBuilder
            .Create(clientId)
            .WithTenantId(tenantId)
            .WithRedirectUri(redirectUri)
            .Build();

        AuthenticationResult result;
        var accounts = await app.GetAccountsAsync();

        try
        {
            // Try to acquire token silently
            result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
                              .ExecuteAsync();
        }
        catch (MsalUiRequiredException)
        {
            // Fallback to interactive login
            result = await app.AcquireTokenInteractive(scopes)
                              .ExecuteAsync();
        }

        var token = result.AccessToken;
        Console.WriteLine("Access Token: " + token);
    }
}

enter image description here

参考:

获取令牌以调用 Web API(单页应用程序)- Microsoft 身份平台 |微软

© www.soinside.com 2019 - 2024. All rights reserved.