使用无人值守c#控制台验证Office 365 IMAP帐户



我正在开发一个。net核心控制台应用程序(c#),需要对Office 365 IMAP帐户进行身份验证。目的是无人值守地检索邮件和处理CSV文件附件。

应用程序已在Azure上注册为移动/桌面应用程序,RedirectUri设置为http://localhost

下面的代码导致在Chrome web浏览器中打开一个新选项卡,并要求使用Outlook帐户进行登录。我需要阻止浏览器打开并完全从代码处理身份验证。

当前代码:

using var client = new ImapClient(new ProtocolLogger("imap.log"));
var options = new PublicClientApplicationOptions
{
ClientId = _options.ClientId,
TenantId = _options.TenantId,
RedirectUri = "http://localhost"
};
var publicClientApplication = PublicClientApplicationBuilder
.CreateWithApplicationOptions(options)
.Build();
var scopes = new[]
{
"email",
"offline_access",
"https://outlook.office.com/IMAP.AccessAsUser.All" // Only needed for IMAP
//"https://outlook.office.com/POP.AccessAsUser.All",  // Only needed for POP
//"https://outlook.office.com/SMTP.AccessAsUser.All", // Only needed for SMTP
};
var cancellationToken = new CancellationToken();
var authToken = await publicClientApplication
.AcquireTokenInteractive(scopes)
.ExecuteAsync(cancellationToken);

await publicClientApplication
.AcquireTokenSilent(scopes, authToken.Account)
.ExecuteAsync(cancellationToken);
SaslMechanism oauth2;
if (client.AuthenticationMechanisms.Contains("OAUTHBEARER"))
{
oauth2 = new SaslMechanismOAuthBearer(authToken.Account.Username, authToken.AccessToken);
} 
else
{
oauth2 = new SaslMechanismOAuth2(authToken.Account.Username, authToken.AccessToken);
}
await client.AuthenticateAsync(oauth2);
await client.DisconnectAsync (true);

这一行触发浏览器窗口打开https://login.microsoftonline.com/:

var authToken = await publicClientApplication
.AcquireTokenInteractive(scopes)
.ExecuteAsync(cancellationToken);

此控制台应用程序将在无人值守的情况下运行。如何在不打开浏览器的情况下获取令牌并进行身份验证?

这是对你最近评论的回答,因为这是我最后的建议。所以,首先,你应该决定你是想代表用户访问数据,还是作为一个由admin授予权限的应用程序。

第一步是注册你的应用。

第二步是获取访问令牌。这将根据您选择的方法而有所不同。每个教程:代表用户或不代表用户操作,但由管理员授予权限。

一旦有了访问令牌,就可以调用Microsoft Graph API。重要的是,你总是需要调用微软图形API。(据我所知)没有其他官方的方式与微软的服务进行沟通。你可以用微软图形资源管理器尝试请求,但是它的默认url/参数非常有限,所以我建议看一下文档。

根据您所描述的,您首先要获得UserID。执行此操作的方法将根据您选择的验证类型而变化。

  • 如果您选择代表用户行事,您应该能够使用此端点获取该(ID):https://graph.microsoft.com/v1.0/me/
  • 如果你选择作为一个应用程序与管理员同意,你应该能够搜索用户使用https://graph.microsoft.com/v1.0/me/people/?$search=与搜索查询参数。下面是这个端点
  • 的文档

现在,唯一剩下的事情是将该ID提供给Outlook api方法之一。你可以在这里找到他们的文档。具体来说,您似乎想要列出所有消息,然后读取特定的消息。

另外,要注意使用哪些方法来处理哪种类型的验证。代表用户,你通常想要包含/me的url,代表具有给定管理权限的应用程序,你通常想要一些端点,使你能够传递用户id。

希望我帮到你!

PS:此响应中没有代码,因为如果没有您在Azure上的决策和操作等,有很多东西无法编码。我建议你使用我之前链接的微软文档阅读一些关于授权和图形api的内容。

在azure中注册应用程序并获得客户端秘密后,此代码为我使用MSAL工作。

var options = new ConfidentialClientApplicationOptions
{
ClientId = "<ClientID or Application ID>",
TenantId = "<Azure TenantId>",
RedirectUri = "http://localhost"
};

string clientSecret = "<Client Secret Goes here>";

var confidentialClientApplication = ConfidentialClientApplicationBuilder
.CreateWithApplicationOptions(options)
.WithClientSecret(clientSecret)
.Build();

var scopes = new string[] {
"https://outlook.office365.com/.default"

};

var authToken = await confidentialClientApplication.AcquireTokenForClient(scopes).ExecuteAsync();

最新更新