Beheben einfacher Authentifizierungsprobleme in Outlook mithilfe von MailKit und der ASP.NET Core-Web-API

OAuth2

Grundlegendes zu Outlook-Authentifizierungsproblemen mit ASP.NET Core und MailKit

Bei der Integration der Outlook-E-Mail-Funktionalität in eine Bei der Verwendung von MailKit stoßen Entwickler häufig auf Authentifizierungsprobleme. Ein häufiges Problem ist die Fehlermeldung „535: 5.7.139 Authentifizierung fehlgeschlagen“. Dies tritt normalerweise auf, wenn die Standardauthentifizierungsmethode auf dem Outlook-Server deaktiviert ist und der Verbindungsversuch fehlschlägt.

Die einst weit verbreitete Basisauthentifizierung wird von Dienstanbietern wie Microsoft zunehmend deaktiviert, um die Sicherheit zu erhöhen. Stattdessen werden moderne Authentifizierungsmethoden wie OAuth2 bevorzugt. Diese Verschiebung kann zu Verwirrung führen, insbesondere bei Entwicklern, die es gewohnt sind, Benutzernamen und Passwörter direkt zu verwenden.

In diesem Szenario haben Sie möglicherweise die korrekten Outlook-SMTP-Servereinstellungen und das anwendungsspezifische Kennwort verwendet, sind aber dennoch auf Authentifizierungsfehler gestoßen. Für die effiziente Lösung dieser Probleme ist es wichtig zu verstehen, warum die Basisauthentifizierung fehlschlägt. Der Fehler weist eher auf die Durchsetzung einer Sicherheitsrichtlinie als auf ein Problem mit dem Code selbst hin.

In diesem Artikel werden wir untersuchen, warum dieser Fehler auftritt, welche Ursachen ihm zugrunde liegen und welche Schritte Sie zur Behebung des Problems unternehmen können. Wir besprechen auch alternative Authentifizierungsmethoden wie OAuth2, um eine sichere und erfolgreiche Kommunikation mit den Outlook-Servern zu gewährleisten.

Befehl Anwendungsbeispiel
ConfidentialClientApplicationBuilder.Create() Mit diesem Befehl wird eine vertrauliche Clientanwendung für die OAuth2-Authentifizierung erstellt. Es ist Teil der Microsoft Identity Client (MSAL)-Bibliothek und initialisiert die App mit einer Client-ID, sodass sie Token für die sichere Kommunikation abrufen kann.
SaslMechanismOAuth2() Dieser Befehl ist spezifisch für MailKit und wird zur Authentifizierung mit einem OAuth2-Token beim Senden von E-Mails verwendet. Es umgeht die Standardauthentifizierung, indem es eine sicherere Methode über das OAuth2-Protokoll verwendet.
AcquireTokenForClient(scopes).ExecuteAsync() Diese Methode ruft ein OAuth2-Token für die Clientanwendung ab. Es ist Teil der MSAL-Bibliothek und für die Generierung von Zugriffstokens für APIs wie Microsoft Graph oder SMTP-Server unerlässlich.
GraphServiceClient Dieses Objekt wird in der Microsoft Graph-API verwendet, um mit Microsoft-Diensten zu interagieren. Es ermöglicht Entwicklern, mithilfe von OAuth2-Token E-Mails zu senden, Benutzer zu verwalten oder mit anderen Ressourcen in Microsoft 365 zu interagieren.
DelegateAuthenticationProvider() Mit diesem Befehl wird der Authentifizierungsprozess für Microsoft Graph-API-Anfragen eingerichtet. Es weist jeder API-Anfrage dynamisch ein OAuth2-Token zu und gewährleistet so eine sichere Kommunikation.
SendMail(message, false).Request().PostAsync() Dieser Befehl ist Teil der Graph-API, die die erstellte E-Mail-Nachricht asynchron sendet. Mithilfe der sicheren E-Mail-Versandfunktion von Microsoft Graph wird die Nachricht an das Postfach des Benutzers gesendet.
SmtpClient.AuthenticateAsync() In MailKit ermöglicht dieser Befehl dem Client die Authentifizierung beim E-Mail-Server mithilfe von Anmeldeinformationen wie OAuth2-Tokens. Es ersetzt die herkömmliche Authentifizierungsmethode mit Benutzername und Passwort.
SecureSocketOptions.StartTls Dieser Befehl wird beim Herstellen einer Verbindung zum SMTP-Server verwendet, um eine sichere, verschlüsselte Verbindung über das STARTTLS-Protokoll zu erzwingen und sicherzustellen, dass die Daten sicher über das Netzwerk übertragen werden.
MimeMessage Diese Klasse stellt eine E-Mail-Nachricht in der MailKit-Bibliothek dar. Es enthält Details wie Absender, Empfänger, Betreff und Text der E-Mail. Es ist wichtig für die Erstellung und Formatierung von E-Mail-Inhalten vor dem Senden.

Erkundung der OAuth2-Integration für sicheren E-Mail-Versand

Die oben bereitgestellten Skripte sind darauf ausgelegt, das Problem zu beheben Tritt auf, wenn E-Mails über den SMTP-Server von Outlook mithilfe von MailKit in einer ASP.NET Core-Web-API gesendet werden. Der Fehler tritt auf, weil Microsoft die Basisauthentifizierung deaktiviert hat, um die Sicherheit zu erhöhen, was Entwickler dazu zwingt, OAuth2 zu verwenden, eine sicherere Authentifizierungsmethode. In der ersten Lösung verwendeten wir MailKit mit OAuth2-Tokens zur Authentifizierung und zum Senden einer E-Mail. Anstatt sich auf einen Benutzernamen und ein Passwort zu verlassen, erfordert OAuth2 ein Token, das vom Microsoft Identity Client (MSAL) generiert und zur sicheren Authentifizierung von Anfragen verwendet wird.

Zunächst verwendet die Lösung die Methode „ConfidentialClientApplicationBuilder.Create()“, Teil der MSAL-Bibliothek, um eine Clientanwendung zu erstellen. Dieser Schritt initialisiert die Anwendung mit wesentlichen Anmeldeinformationen wie der Client-ID, der Mandanten-ID und dem Client-Geheimnis, die zum Generieren eines OAuth2-Tokens erforderlich sind. Sobald die Anwendung erstellt ist, ruft die Methode „AcquireTokenForClient()“ das Token ab, das für die Authentifizierung beim SMTP-Server von Outlook erforderlich ist. Mithilfe des Mechanismus „SaslMechanismOAuth2()“ kann MailKit dann den E-Mail-Versandprozess mithilfe dieses Tokens authentifizieren und dabei die Standardauthentifizierung vollständig umgehen. Diese Methode stellt sicher, dass die Anwendung moderne Sicherheitsprotokolle einhält und veraltete Methoden vermeidet.

Bei der zweiten Lösung wird die Microsoft Graph API zum Versenden von E-Mails verwendet, ohne direkt mit dem SMTP-Server zu interagieren. Microsoft Graph bietet eine Komplettlösung für die Verwaltung von Microsoft-Diensten, einschließlich Outlook-E-Mails. Die Graph-API nutzt die OAuth2-Authentifizierung über „DelegateAuthenticationProvider()“, das jeder Anfrage ein OAuth2-Token zuweist. Dieses Token wird auf ähnliche Weise mit MSAL generiert. Das „GraphServiceClient“-Objekt erleichtert die sichere Kommunikation mit den Microsoft-Servern und ermöglicht der API den nahtlosen Versand von E-Mails. Diese Methode ist besonders nützlich für diejenigen, die eine breitere Palette von Microsoft-Diensten mit weniger direkten Verbindungen zu einzelnen Diensten wie SMTP verwalten möchten.

Schließlich haben wir in der dritten Lösung einen traditionelleren Ansatz unter Verwendung der integrierten Lösung untersucht Namensraum von .NET. Während zur Authentifizierung immer noch OAuth2 verwendet wird, ersetzt diese Methode MailKit durch den SMTP-Client von System.Net.Mail zum Senden von E-Mails. Das OAuth2-Token wird als Anmeldeinformation anstelle der üblichen Kombination aus Benutzername und Passwort übergeben. Die E-Mail wird mithilfe der typischen Objekte „MailMessage“ und „SmtpClient“ erstellt und gesendet. Dieser Ansatz kann für Entwickler nützlich sein, die lieber mit nativen .NET-Bibliotheken arbeiten, aber dennoch eine sichere OAuth2-Authentifizierung für den E-Mail-Versand benötigen.

Alle diese Methoden lösen nicht nur das Problem der deaktivierten Basisauthentifizierung, sondern machen auch die E-Mail-Versandfunktionalität in Ihrer ASP.NET Core-Web-API zukunftssicher. Jede Lösung unterstreicht die Bedeutung der Sicherheit durch OAuth2 und ersetzt veraltete und weniger sichere Authentifizierungsmethoden. Durch die Nutzung moderner Authentifizierungsbibliotheken wie MSAL und Microsoft Graph können Entwickler sicherstellen, dass ihre Anwendungen den neuesten Sicherheitsstandards entsprechen und gleichzeitig zuverlässige E-Mail-Versandfunktionen bieten.

Lösung 1: Wechsel zu OAuth2 für die Outlook-Authentifizierung

Dieser Ansatz verwendet ASP.NET Core und MailKit und ersetzt die Standardauthentifizierung durch OAuth2, die empfohlene Methode für den sicheren E-Mail-Versand in 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);
}

Lösung 2: Verwenden der Microsoft Graph-API zum Senden von E-Mails

Bei dieser Methode wird die Microsoft Graph-API zum Senden von E-Mails von einem ASP.NET Core-Backend verwendet, wobei die SMTP-Konfiguration vollständig umgangen wird.

// 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();

Lösung 3: Verwendung von OAuth2 mit SMTP (andere Bibliothek)

Dieser Ansatz verwendet System.Net.Mail zum Senden von E-Mails mit OAuth2 anstelle von MailKit und mit derselben OAuth-Authentifizierungsmethode.

// 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);

Implementierung moderner Sicherheitsstandards für den E-Mail-Versand

Im Kontext moderner E-Mail-Systeme wird die Basisauthentifizierung zunehmend als veraltet und unsicher angesehen. Dies gilt insbesondere für große Dienstanbieter wie Outlook, die die Basisauthentifizierung deaktiviert haben, um sicherere Mechanismen wie OAuth2 durchzusetzen. Die Standardauthentifizierung, die ausschließlich auf einem Benutzernamen und einem Passwort basiert, ist anfällig für Brute-Force-Angriffe und kann gefährdet werden, wenn Anmeldeinformationen gestohlen werden. Daher stellt die von Microsoft empfohlene Umstellung auf OAuth2 sicher, dass Token sicher ausgetauscht werden, ohne dass Benutzeranmeldeinformationen offengelegt werden.

Ein entscheidender Aspekt bei der Implementierung von OAuth2 ist das Konzept der Zugriffstoken. Anstatt sich auf die direkte Authentifizierung über SMTP-Server zu verlassen, stellt OAuth2 zeitgebundene Token aus, die einen sicheren Zugriff auf Ressourcen wie E-Mail-Dienste ermöglichen. Diese Token werden von einem Autorisierungsserver gewährt und Entwickler können sie über Bibliotheken wie Microsoft Identity Client (MSAL) erhalten. Mit diesen Tokens erhalten Anwendungen eingeschränkten Zugriff auf das Benutzerkonto, wodurch die mit längeren, statischen Anmeldeinformationen verbundenen Risiken verringert werden.

Darüber hinaus passt die Einführung von OAuth2 Ihre Anwendung nicht nur an moderne Sicherheitspraktiken an, sondern bereitet sie auch auf zukünftige Entwicklungen vor. Viele APIs, darunter auch solche für cloudbasierte Dienste, verlassen sich für die sichere Kommunikation inzwischen stark auf OAuth2. Dadurch wird sichergestellt, dass die E-Mail-Versandfunktion auch bei Weiterentwicklung der Dienste funktionsfähig und sicher bleibt. Für Entwickler, die integrieren mit Die Verwendung von OAuth2 bringt eine Reihe von Sicherheitsverbesserungen mit sich, von der tokenbasierten Authentifizierung bis hin zu verschlüsselten Übertragungen über Protokolle wie STARTTLS.

  1. Was verursacht den Fehler 535: 5.7.139 in Outlook?
  2. Dieser Fehler tritt auf, weil die Standardauthentifizierung für den SMTP-Server von Outlook deaktiviert ist. Microsoft verlangt jetzt OAuth2 für die sichere Authentifizierung.
  3. Wie kann ich OAuth2 in MailKit aktivieren?
  4. Sie können OAuth2 implementieren, indem Sie verwenden um Ihre Anwendung zu konfigurieren und um den E-Mail-Versand mit Token zu authentifizieren.
  5. Was ist die Alternative zur Standardauthentifizierung für den E-Mail-Versand in Outlook?
  6. OAuth2 ist die bevorzugte Alternative. Es verwendet Token anstelle von Benutzernamen und Passwörtern für eine sichere, zeitlich begrenzte Authentifizierung.
  7. Ist die Microsoft Graph-API besser als die Verwendung von SMTP zum Senden von E-Mails?
  8. Die Microsoft Graph API ist ein umfassenderer Dienst, der mehr als nur das Versenden von E-Mails bewältigen kann. Es ist vielseitiger und wird empfohlen, wenn Sie Zugriff auf verschiedene Microsoft 365-Ressourcen benötigen.
  9. Wie teste ich, ob OAuth2 in meiner Anwendung ordnungsgemäß funktioniert?
  10. Sie können Komponententests implementieren, um zu überprüfen, ob Ihre OAuth2-Token korrekt generiert und an den E-Mail-Versanddienst übergeben werden.

Um den grundlegenden Authentifizierungsfehler in Outlook zu beheben, müssen moderne Sicherheitsstandards wie OAuth2 übernommen werden. Dieser Ansatz beseitigt die Schwachstellen der Basisauthentifizierung und bietet eine sicherere Methode zum Senden von Nachrichten über den SMTP-Server von Outlook.

Durch die Integration von OAuth2 mit ASP.NET Core und MailKit können Entwickler ihre Anwendungen zukunftssicher machen und so eine sichere Kommunikation und die Einhaltung aktualisierter Anforderungen von Dienstanbietern gewährleisten. Dadurch wird nicht nur das Authentifizierungsproblem gelöst, sondern auch die allgemeine Sicherheit und Funktionalität verbessert.

  1. Ausführliche Dokumentation zur Abschaffung der Basisauthentifizierung und der OAuth2-Implementierung durch Microsoft: Einstellung der Microsoft Exchange Online-Basisauthentifizierung
  2. Umfassende Anleitung zur Verwendung von MailKit und MimeKit in .NET für E-Mail-Funktionen: MailKit-Dokumentation
  3. Dokumentation der MSAL-Bibliothek (Microsoft Identity Client) für die OAuth2-Authentifizierung: Übersicht über die Microsoft Identity Platform (MSAL).