首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MailKit、Office 365和OAUTH2:服务器端应用程序身份验证中的问题

MailKit、Office 365和OAUTH2:服务器端应用程序身份验证中的问题
EN

Stack Overflow用户
提问于 2021-04-27 08:31:27
回答 1查看 6.3K关注 0票数 6

我必须构建一个.Net控制台应用程序,它作为一个批处理在服务器端运行,并使用Office365和MailKit向收件人发送电子邮件。

我们公司最近推出了MultiFactor身份验证;我已经重写了一个交互式应用程序,允许用户使用MailKit和MFA发送电子邮件,但我无法在无人值守的应用程序中实现相同的功能。

我已经在Microsoft上注册了应用程序,创建了客户端秘密并实现了以下类:

代码语言:javascript
运行
复制
    public class Mailer {
    public async static void Send(string subject, string body) {
        string tenantID = "abcdef";
        string clientId = "ghilmn";
        string clientSecret = "opqrst";
        string appName = "MyApp";

        //clientSecret = Uri.EscapeDataString(clientSecret);
        //clientSecret = Uri.EscapeUriString(clientSecret);

        var MyConfidentialClientApplication = ConfidentialClientApplicationBuilder.Create(clientId)
            .WithClientSecret(clientSecret)
            .WithTenantId(tenantID)
            .Build();

        var scopes = new string[] {"https://graph.microsoft.com/.default"};

        try {
            var authToken = await MyConfidentialClientApplication.AcquireTokenForClient(scopes).ExecuteAsync();

            var oauth2 = new SaslMechanismOAuth2(appName, authToken.AccessToken);  //  SaslMechanismOAuth2(appName, authToken.AccessToken);
            var m_client = new SmtpClient(new ProtocolLogger("smtp.log"));
            await m_client.ConnectAsync("outlook.office365.com", 587, SecureSocketOptions.StartTls);
            await m_client.AuthenticateAsync(oauth2);
        }
        catch (Exception ex) {
            Debug.WriteLine(ex.Message);
            // do nothing;
        }
        return;

    }

虽然令牌似乎是正确获得的( authToken.AccessToken不是空的),但是

等待m_client.AuthenticateAsync(oauth2);

生成以下错误:

代码语言:javascript
运行
复制
Eccezione generata: 'MailKit.Security.AuthenticationException' in System.Private.CoreLib.dll
535: 5.7.3 Authentication unsuccessful [ZR0P278CA0036.CHEP278.PROD.OUTLOOK.COM]

基本上我不明白

如果

  • 是正确的调用
  • (如果是的话),那么将向oauth2的构造函数传递什么userName;我尝试了AppName、AppID,甚至是用户电子邮件,但没有成功。

如有任何提示将不胜感激,谢谢。

保罗

P.S.是正在工作的交互式应用程序,它使用以下代码使用PublicClientApplicationBuilder和AcquireTokenInteractive调用。

代码语言:javascript
运行
复制
        public async Task  Connect_MFA() {
        
        var options = new PublicClientApplicationOptions {
            ClientId = "abcd",
            TenantId = "efgh",
            RedirectUri = "https://login.microsoftonline.com/common/oauth2/nativeclient"
        };

        var publicClientApplication = PublicClientApplicationBuilder
            .CreateWithApplicationOptions(options)
            .Build();

        var scopes = new string[] {
            "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.Send", // Only needed for SMTP
        };

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

        var oauth2 = new SaslMechanismOAuth2(authToken.Account.Username, authToken.AccessToken);

        m_client = new SmtpClient(new ProtocolLogger("smtp.log"));
        await m_client.ConnectAsync("outlook.office365.com", 587, SecureSocketOptions.StartTls);
        await m_client.AuthenticateAsync(oauth2);
    }
EN

回答 1

Stack Overflow用户

发布于 2022-07-21 17:39:13

反应晚了,但我希望这能挽救我研究这一周的另一个人。

最简单/最好的答案是使用Microsoft.Graph。参见:https://learn.microsoft.com/en-us/graph/api/user-sendmail?view=graph-rest-1.0&tabs=csharp

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67279556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档