希望您能提供帮助,因为我似乎很难理解 oAuth2 和 Office 365 的身份验证选项。
我想要创建的系统是一个自动化过程,每小时(作为示例)检查我的 Office 365 邮箱中特定文件夹中是否有新邮件。 这听起来很容易,因为我可以使用 MailKit 进行邮箱操作,但是我正在努力制定身份验证过程/选项。
当涉及到 Microsoft.Identity.Client 时,我似乎有 2 个选择:
我了解 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 令牌?
提前致谢
根据您的要求
ConfidentialClientApplicationBuilder
适合您的要求。
如果您想获取涉及用户交互的用户特定访问令牌,那么您必须利用
PublicClientApplicationBuilder
流。
但是令牌似乎很快就会过期,因此不确定这是否有效。
否则,您可以使用
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);
}
}
参考: