Solucionar problemes d'autenticació simple a Outlook mitjançant MailKit i l'API web ASP.NET Core

OAuth2

Entendre els problemes d'autenticació d'Outlook amb ASP.NET Core i MailKit

Quan s'integra la funcionalitat de correu electrònic d'Outlook en un utilitzant MailKit, els desenvolupadors sovint es troben amb problemes d'autenticació. Un problema comú és el missatge d'error "535: 5.7.139 Autenticació sense èxit". Això sol passar quan el mètode d'autenticació bàsic està desactivat al servidor d'Outlook, provocant un error en l'intent de connexió.

L'autenticació bàsica, un cop molt utilitzada, ha estat cada cop més desactivada per proveïdors de serveis com Microsoft per millorar la seguretat. En canvi, es prefereixen els mètodes d'autenticació moderns, com ara OAuth2. Aquest canvi pot causar confusió, especialment per als desenvolupadors acostumats a utilitzar noms d'usuari i contrasenyes directament.

En aquest cas, és possible que hàgiu utilitzat la configuració correcta del servidor SMTP d'Outlook i la contrasenya específica de l'aplicació, però encara heu tingut errors d'autenticació. Entendre per què falla l'autenticació bàsica és crucial per resoldre aquests problemes de manera eficient. L'error indica l'aplicació de la política de seguretat en lloc d'un problema amb el codi en si.

En aquest article, explorarem per què es produeix aquest error, les causes subjacents i els passos que podeu seguir per resoldre el problema. També parlarem de mètodes d'autenticació alternatius, com ara OAuth2, per garantir una comunicació segura i exitosa amb els servidors d'Outlook.

Comandament Exemple d'ús
ConfidentialClientApplicationBuilder.Create() Aquesta ordre s'utilitza per crear una aplicació client confidencial per a l'autenticació OAuth2. Forma part de la biblioteca Microsoft Identity Client (MSAL) i inicialitza l'aplicació amb un ID de client, la qual cosa li permet adquirir testimonis per a una comunicació segura.
SaslMechanismOAuth2() Aquesta ordre és específica de MailKit i s'utilitza per autenticar-se amb un testimoni OAuth2 quan s'envien correus electrònics. Evita l'autenticació bàsica utilitzant un mètode més segur mitjançant el protocol OAuth2.
AcquireTokenForClient(scopes).ExecuteAsync() Aquest mètode adquireix un testimoni OAuth2 per a l'aplicació client. Forma part de la biblioteca MSAL i és essencial per generar testimonis d'accés per a API com Microsoft Graph o servidors SMTP.
GraphServiceClient Aquest objecte s'utilitza a l'API de Microsoft Graph per interactuar amb els serveis de Microsoft. Permet als desenvolupadors enviar correus electrònics, gestionar usuaris o interactuar amb altres recursos de Microsoft 365 mitjançant fitxes OAuth2.
DelegateAuthenticationProvider() Aquesta ordre s'utilitza per configurar el procés d'autenticació per a les sol·licituds de l'API de Microsoft Graph. Assigna un testimoni OAuth2 a cada sol·licitud d'API de manera dinàmica, garantint una comunicació segura.
SendMail(message, false).Request().PostAsync() Aquesta ordre forma part de l'API Graph que envia el missatge de correu electrònic construït de manera asíncrona. Publica el missatge a la bústia de correu de l'usuari mitjançant la funcionalitat segura d'enviament de correu electrònic de Microsoft Graph.
SmtpClient.AuthenticateAsync() A MailKit, aquesta ordre permet que el client s'autentiqui amb el servidor de correu electrònic mitjançant credencials com ara testimonis OAuth2. Substitueix el mètode tradicional d'autenticació de nom d'usuari i contrasenya.
SecureSocketOptions.StartTls Aquesta ordre s'utilitza quan es connecta al servidor SMTP per imposar una connexió segura i xifrada mitjançant el protocol STARTTLS, assegurant que les dades es transfereixen de manera segura a la xarxa.
MimeMessage Aquesta classe representa un missatge de correu electrònic a la biblioteca MailKit. Conté detalls com el remitent, el destinatari, l'assumpte i el cos del correu electrònic. És essencial per crear i donar format al contingut del correu electrònic abans d'enviar-lo.

Explorant la integració d'OAuth2 per a l'enviament segur de correu electrònic

Els scripts proporcionats anteriorment estan dissenyats per abordar el problema trobat en enviar correus electrònics a través del servidor SMTP d'Outlook mitjançant MailKit en una API web ASP.NET Core. L'error es produeix perquè Microsoft ha desactivat l'autenticació bàsica per millorar la seguretat, obligant els desenvolupadors a adoptar OAuth2, un mètode d'autenticació més segur. A la primera solució, vam utilitzar MailKit amb fitxes OAuth2 per autenticar i enviar un correu electrònic. En lloc de confiar en un nom d'usuari i una contrasenya, OAuth2 requereix un testimoni, que el genera Microsoft Identity Client (MSAL) i s'utilitza per autenticar les sol·licituds de manera segura.

Per començar, la solució utilitza el mètode `ConfidentialClientApplicationBuilder.Create()`, part de la biblioteca MSAL, per crear una aplicació client. Aquest pas inicialitza l'aplicació amb credencials essencials com l'identificador de client, l'identificador de l'inquilí i el secret del client, que són necessaris per generar un testimoni OAuth2. Un cop construïda l'aplicació, el mètode `AcquireTokenForClient()` recupera el testimoni necessari per autenticar-se amb el servidor SMTP d'Outlook. Mitjançant el mecanisme `SaslMechanismOAuth2()`, MailKit pot autenticar el procés d'enviament de correu electrònic mitjançant aquest testimoni, sense passar per complet l'autenticació bàsica. Aquest mètode garanteix que l'aplicació s'adhereix als protocols de seguretat moderns i evita mètodes obsolets.

En la segona solució, l'API de Microsoft Graph s'utilitza per enviar correus electrònics sense interactuar directament amb el servidor SMTP. Microsoft Graph ofereix una solució tot en un per gestionar els serveis de Microsoft, inclosos els correus electrònics d'Outlook. L'API Graph aprofita l'autenticació OAuth2 a través del `DelegateAuthenticationProvider()', que assigna un testimoni OAuth2 a cada sol·licitud. Aquest testimoni es genera de manera similar amb MSAL. L'objecte `GraphServiceClient` facilita la comunicació segura amb els servidors de Microsoft, permetent que l'API enviï correus electrònics sense problemes. Aquest mètode és especialment útil per a aquells que volen gestionar un conjunt més ampli de serveis de Microsoft amb menys connexions directes a serveis individuals com SMTP.

Finalment, a la tercera solució, vam explorar un enfocament més tradicional mitjançant l'incorporat espai de noms de .NET. Tot i que encara utilitza OAuth2 per a l'autenticació, aquest mètode substitueix MailKit amb el client SMTP de System.Net.Mail per enviar correus electrònics. El testimoni OAuth2 es passa com a credencial en lloc de la combinació habitual de nom d'usuari i contrasenya. El correu electrònic es construeix i s'envia utilitzant els objectes típics "MailMessage" i "SmtpClient". Aquest enfocament pot ser útil per als desenvolupadors que prefereixen treballar amb biblioteques .NET natives però que encara requereixen una autenticació OAuth2 segura per enviar correus electrònics.

Tots aquests mètodes no només resolen el problema de la desactivació de l'autenticació bàsica, sinó que també aseguren la funcionalitat d'enviament de correu electrònic a la vostra API web ASP.NET Core. Cada solució destaca la importància de la seguretat mitjançant OAuth2, substituint mètodes d'autenticació obsolets i menys segurs. Mitjançant l'aprofitament de biblioteques d'autenticació modernes com MSAL i Microsoft Graph, els desenvolupadors poden assegurar-se que les seves aplicacions segueixen complint els estàndards de seguretat més recents, alhora que ofereixen capacitats d'enviament de correu electrònic fiables.

Solució 1: Canviar a OAuth2 per a l'autenticació d'Outlook

Aquest enfocament utilitza ASP.NET Core i MailKit, substituint l'autenticació bàsica per OAuth2, que és el mètode recomanat per enviar correu electrònic segur a Outlook.

// Step 1: Install required NuGet packages
// MailKit, MimeKit, and Microsoft.Identity.Client for OAuth2

using MailKit.Net.Smtp;
using MimeKit;
using Microsoft.Identity.Client;

// Step 2: Configure OAuth2 authentication
var clientId = "your-client-id";
var tenantId = "your-tenant-id";
var clientSecret = "your-client-secret";

var cca = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithClientSecret(clientSecret)
    .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}"))
    .Build();

var scopes = new[] { "https://outlook.office365.com/.default" };
var result = await cca.AcquireTokenForClient(scopes).ExecuteAsync();

// Step 3: Send email using OAuth2 token
var emailMessage = new MimeMessage();
emailMessage.From.Add(new MailboxAddress("Your Name", "your-email@outlook.com"));
emailMessage.To.Add(new MailboxAddress("Recipient", "recipient@example.com"));
emailMessage.Subject = "Subject";
emailMessage.Body = new TextPart("plain") { Text = "Hello, this is a test email." };

using (var smtpClient = new SmtpClient())
{
    await smtpClient.ConnectAsync("smtp.office365.com", 587, SecureSocketOptions.StartTls);
    await smtpClient.AuthenticateAsync(new SaslMechanismOAuth2("your-email@outlook.com", result.AccessToken));
    await smtpClient.SendAsync(emailMessage);
    await smtpClient.DisconnectAsync(true);
}

Solució 2: ús de l'API de Microsoft Graph per enviar correus electrònics

Aquest mètode implica utilitzar l'API de Microsoft Graph per enviar correus electrònics des d'un backend ASP.NET Core, sense passar per complet la configuració SMTP.

// Step 1: Add Microsoft.Graph NuGet package
using Microsoft.Graph;
using Microsoft.Identity.Client;

// Step 2: Configure Graph API and authentication
var confidentialClient = ConfidentialClientApplicationBuilder.Create(clientId)
    .WithTenantId(tenantId)
    .WithClientSecret(clientSecret)
    .Build();

var graphClient = new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) =>
{
    var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync();
    requestMessage.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);
}));

// Step 3: Prepare and send email via Graph API
var message = new Message
{
    Subject = "Test Email",
    Body = new ItemBody
    {
        ContentType = BodyType.Text,
        Content = "Hello, this is a test email sent via Microsoft Graph API."
    },
    ToRecipients = new List<Recipient>()
    {
        new Recipient { EmailAddress = new EmailAddress { Address = "recipient@example.com" } }
    }
};

await graphClient.Users["your-email@outlook.com"].SendMail(message, false).Request().PostAsync();

Solució 3: ús d'OAuth2 amb SMTP (biblioteca diferent)

Aquest enfocament utilitza System.Net.Mail per enviar correus electrònics amb OAuth2, en lloc de MailKit, amb el mateix mètode d'autenticació OAuth.

// Step 1: Configure OAuth2 with System.Net.Mail
var smtpClient = new SmtpClient("smtp.office365.com")
{
    Port = 587,
    EnableSsl = true,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential("your-email@outlook.com", accessToken)
};

// Step 2: Construct the email message
var mailMessage = new MailMessage
{
    From = new MailAddress("your-email@outlook.com"),
    Subject = "Test Email",
    Body = "This is a test email sent using System.Net.Mail with OAuth2.",
    IsBodyHtml = true
};

mailMessage.To.Add("recipient@example.com");

// Step 3: Send the email
await smtpClient.SendMailAsync(mailMessage);

Implementació d'estàndards de seguretat moderns per a l'enviament de correu electrònic

En el context dels sistemes de correu electrònic moderns, l'autenticació bàsica es considera cada cop més obsoleta i insegura. Això és especialment cert per als principals proveïdors de serveis com Outlook, que han desactivat l'autenticació bàsica per aplicar mecanismes més segurs com OAuth2. L'autenticació bàsica, que es basa únicament en un nom d'usuari i una contrasenya, és vulnerable als atacs de força bruta i es pot posar en perill si es roben les credencials. Per tant, el canvi a OAuth2, tal com recomana Microsoft, garanteix que els testimonis s'intercanvien de manera segura sense exposar les credencials de l'usuari.

Un aspecte crucial de la implementació d'OAuth2 és el concepte de fitxes d'accés. En lloc de confiar en l'autenticació directa a través de servidors SMTP, OAuth2 emet testimonis de temps que permeten un accés segur a recursos com els serveis de correu electrònic. Aquests testimonis els concedeix un servidor d'autorització i els desenvolupadors poden obtenir-los mitjançant biblioteques com Microsoft Identity Client (MSAL). Amb aquests testimonis, les aplicacions tenen accés limitat al compte de l'usuari, reduint els riscos associats a credencials estàtiques prolongades.

A més, l'adopció d'OAuth2 no només alinea la vostra aplicació amb les pràctiques de seguretat modernes, sinó que també la prepara per a desenvolupaments futurs. Moltes API, incloses les de serveis basats en núvol, ara depenen molt d'OAuth2 per a una comunicació segura. Això garanteix que la funcionalitat d'enviament de correu electrònic segueixi sent funcional i segura a mesura que evolucionen els serveis. Per a desenvolupadors que s'integren amb , l'ús d'OAuth2 aporta una sèrie de millores de seguretat, des de l'autenticació basada en testimonis fins a transmissions xifrades mitjançant protocols com STARTTLS.

  1. Què causa l'error 535: 5.7.139 a Outlook?
  2. Aquest error es produeix perquè l'autenticació bàsica està desactivada per al servidor SMTP d'Outlook. Microsoft ara requereix OAuth2 per a l'autenticació segura.
  3. Com puc habilitar OAuth2 a MailKit?
  4. Podeu implementar OAuth2 fent servir per configurar la teva aplicació i per autenticar l'enviament de correu electrònic amb testimonis.
  5. Quina és l'alternativa a l'autenticació bàsica per enviar correus electrònics a Outlook?
  6. OAuth2 és l'alternativa preferida. Utilitza fitxes en lloc de noms d'usuari i contrasenyes per a una autenticació segura i de temps limitat.
  7. És millor l'API de Microsoft Graph que utilitzar SMTP per enviar correus electrònics?
  8. Microsoft Graph API és un servei més ampli que pot gestionar més que només enviar correus electrònics. És més versàtil i recomanable si necessiteu accés a diversos recursos de Microsoft 365.
  9. Com puc provar si OAuth2 funciona correctament a la meva aplicació?
  10. Podeu implementar proves unitàries per verificar que els vostres testimonis OAuth2 s'estan generant i s'estan passant correctament al servei d'enviament de correu electrònic.

La resolució de l'error bàsic d'autenticació a Outlook requereix l'adopció d'estàndards de seguretat moderns com OAuth2. Aquest enfocament elimina les vulnerabilitats de l'autenticació bàsica i proporciona un mètode més segur per enviar missatges a través del servidor SMTP d'Outlook.

En integrar OAuth2 amb ASP.NET Core i MailKit, els desenvolupadors poden preparar les seves aplicacions per al futur, garantint comunicacions segures i el compliment dels requisits actualitzats dels proveïdors de serveis. Això no només resol el problema d'autenticació, sinó que també millora la seguretat i la funcionalitat generals.

  1. Documentació detallada sobre l'abandonament de Microsoft de l'autenticació bàsica i la implementació d'OAuth2: Desactivació de l'autenticació bàsica de Microsoft Exchange Online
  2. Guia completa sobre com utilitzar MailKit i MimeKit a .NET per a les funcionalitats de correu electrònic: Documentació de MailKit
  3. Documentació de la biblioteca MSAL (Microsoft Identity Client) per a l'autenticació OAuth2: Visió general de Microsoft Identity Platform (MSAL).