【问题标题】:How do I connect to Exchange Online using OAuth 2.0 in MailKit?如何使用 MailKit 中的 OAuth 2.0 连接到 Exchange Online?
【发布时间】:2020-05-09 21:47:23
【问题描述】:

我有一个 Web 应用程序,它使用 MailKit 和基本身份验证通过 Exchange Online (Office365) 向用户发送电子邮件。我们公司是 MS 合作伙伴,因此有义务在 2020 年 2 月底之前为我们的服务关闭基本身份验证。

所以,我想使用 OAuth 2.0 连接到 Exchange Online,类似于 example。事实上,根据这个answer 可能有一个可用的解决方案,但我找不到任何关于它的信息。

现在我正在使用 MS Identity Platform v2.0,但我不知道该怎么做。

如有任何帮助,将不胜感激。

更新 1

我不想代表已登录的用户发送邮件,而是有一个 Office365 用户帐户可用于向其他人发送邮件(通知等)。

更新 2

我设法使用 Microsoft Graph SDK 和 Username/Password Provider 更接近我想要做的事情。

我们的用户帐户需要多因素身份验证,因此在使用用户密码时出现错误,因为我无法满足第二个因素。当我使用应用程序密码时,由于密码错误,身份验证失败。

更新 3

我现在切换到邮件中继。但如果我能找到答案,我会更新这个问题。

【问题讨论】:

    标签: oauth-2.0 microsoft-graph-api mailkit microsoft-identity-platform


    【解决方案1】:

    使用 Microsoft.Identity.Client,您可以生成一个令牌并通过该令牌进行身份验证。

    我发现下面的 IMAP、POP3 和 SMTP 非常适合我的项目以获得有效的解决方案。尽管该示例显示了交互式方法,但我正在尝试将客户端凭据流与应用程序机密一起使用。

    MailKit - Using OAuth2 With Exchange (IMAP, POP3 or SMTP)

    Microsoft - Authenticate an IMAP, POP or SMTP connection using OAuth

    【讨论】:

    • 我会接受你的回答,虽然我没有测试过。不过,文档看起来不错 - 似乎它是在我找到使用邮件中继的可行解决方案后不久发布的。
    • 没问题,在我找到文档之前在这里发现了你的问题,所以虽然我会放弃对我有帮助的东西:) 希望它可以帮助其他人。
    【解决方案2】:

    我的选择是查看 Microsoft Graph API 。它是所有 Microsoft 服务(包括电子邮件)的单一端点。电子邮件特定端点文档是here

    Microsoft 提供不同语言的 SDK 以使用 Graph API 开发客户端应用程序。

    在高层次上,您需要执行以下操作。

    i) 在 Azure Active Directory 中注册应用程序。见here

    ii) 使用 Oauth2 的“授权码授予”流程获取刷新令牌。见here

    iii) 将刷新令牌换成访问令牌,并使用访问令牌调用 Microsoft Graph API。

    iv) 如果您有应用程序需要执行操作的用例,即使用户处于离线状态,您也需要存储刷新令牌。在这种情况下,请确保在步骤 ii) 中包含范围“离线”

    【讨论】:

    • 感谢您的回答!不幸的是,我的用例似乎与你的有点不同。基本上,我已经有了用户的凭据,并希望在代码中使用它们来进行身份验证——就像 GMail 的 MailKit 示例一样。
    • Alex 你真的不能一直以这种方式存储他们的用户名和密码。这就是我们从基本身份验证转向基于令牌的处理方式的全部原因。
    【解决方案3】:

    我建议查看DotNetOpenAuth 或类似的库并阅读他们的示例。如果 DotNetOpenAuth 库没有内置 Windows Live URL,您可能需要知道用于此目的的 Windows Live URL。

    样品可以在这里找到:https://github.com/DotNetOpenAuth/DotNetOpenAuth.Samples

    【讨论】:

    猜你喜欢
    • 2022-10-08
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2020-11-24
    • 2021-06-09
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多