Åtgärda enkla autentiseringsproblem i Outlook med MailKit och ASP.NET Core Web API

Åtgärda enkla autentiseringsproblem i Outlook med MailKit och ASP.NET Core Web API
Åtgärda enkla autentiseringsproblem i Outlook med MailKit och ASP.NET Core Web API

Förstå Outlook-autentiseringsproblem med ASP.NET Core och MailKit

När du integrerar Outlook e-postfunktioner i en ASP.NET Core webb-API med MailKit stöter utvecklare ofta på autentiseringsproblem. Ett vanligt problem är felmeddelandet "535: 5.7.139 Autentisering misslyckades". Detta inträffar vanligtvis när den grundläggande autentiseringsmetoden är inaktiverad på Outlook-servern, vilket gör att anslutningsförsöket misslyckas.

Grundläggande autentisering, som en gång använts i stor utsträckning, har i allt högre grad inaktiverats av tjänsteleverantörer som Microsoft för att förbättra säkerheten. Istället föredras moderna autentiseringsmetoder, som OAuth2. Denna förändring kan orsaka förvirring, särskilt för utvecklare som är vana vid att använda användarnamn och lösenord direkt.

I det här scenariot kan du ha använt rätt Outlook SMTP-serverinställningar och appspecifikt lösenord, men ändå stött på autentiseringsfel. Att förstå varför grundläggande autentisering misslyckas är avgörande för att lösa dessa problem effektivt. Felet indikerar en upprätthållande av säkerhetspolicyn snarare än ett problem med själva koden.

I den här artikeln kommer vi att utforska varför det här felet uppstår, de bakomliggande orsakerna och de steg du kan vidta för att lösa problemet. Vi kommer också att diskutera alternativa autentiseringsmetoder, såsom OAuth2, för att säkerställa säker och framgångsrik kommunikation med Outlooks servrar.

Kommando Exempel på användning
ConfidentialClientApplicationBuilder.Create() Detta kommando används för att bygga en konfidentiell klientapplikation för OAuth2-autentisering. Det är en del av Microsoft Identity Client-biblioteket (MSAL) och initierar appen med ett klient-ID, vilket gör att den kan skaffa tokens för säker kommunikation.
SaslMechanismOAuth2() Det här kommandot är specifikt för MailKit och används för att autentisera med en OAuth2-token när du skickar e-post. Den kringgår grundläggande autentisering genom att använda en säkrare metod via OAuth2-protokollet.
AcquireTokenForClient(scopes).ExecuteAsync() Denna metod skaffar en OAuth2-token för klientapplikationen. Det är en del av MSAL-biblioteket och är viktigt för att generera åtkomsttokens för API:er som Microsoft Graph eller SMTP-servrar.
GraphServiceClient Det här objektet används i Microsoft Graph API för att interagera med Microsoft-tjänster. Det tillåter utvecklare att skicka e-post, hantera användare eller interagera med andra resurser i Microsoft 365 med OAuth2-tokens.
DelegateAuthenticationProvider() Detta kommando används för att ställa in autentiseringsprocessen för Microsoft Graph API-förfrågningar. Den tilldelar en OAuth2-token till varje API-begäran dynamiskt, vilket säkerställer säker kommunikation.
SendMail(message, false).Request().PostAsync() Detta kommando är en del av Graph API som skickar det konstruerade e-postmeddelandet asynkront. Den skickar meddelandet till användarens brevlåda med hjälp av Microsoft Graphs säkra e-postsändningsfunktion.
SmtpClient.AuthenticateAsync() I MailKit tillåter detta kommando klienten att autentisera med e-postservern med hjälp av referenser som OAuth2-tokens. Den ersätter den traditionella autentiseringsmetoden för användarnamn och lösenord.
SecureSocketOptions.StartTls Detta kommando används vid anslutning till SMTP-servern för att genomdriva en säker, krypterad anslutning via STARTTLS-protokollet, vilket säkerställer att data överförs säkert över nätverket.
MimeMessage Den här klassen representerar ett e-postmeddelande i MailKit-biblioteket. Den innehåller information som avsändare, mottagare, ämne och brödtext i e-postmeddelandet. Det är viktigt för att skapa och formatera e-postinnehåll innan du skickar.

Utforska OAuth2-integration för säker e-postsändning

Skripten ovan är utformade för att ta itu med grundläggande autentiseringsfel påträffas när du skickar e-post via Outlooks SMTP-server med MailKit i ett ASP.NET Core Web API. Felet uppstår eftersom Microsoft har inaktiverat grundläggande autentisering för att förbättra säkerheten, vilket tvingar utvecklare att använda OAuth2, en säkrare autentiseringsmetod. I den första lösningen använde vi MailKit med OAuth2-tokens för att autentisera och skicka ett e-postmeddelande. Istället för att förlita sig på ett användarnamn och lösenord kräver OAuth2 en token, som genereras av Microsoft Identity Client (MSAL) och används för att autentisera förfrågningar på ett säkert sätt.

Till att börja med använder lösningen metoden `ConfidentialClientApplicationBuilder.Create()`, en del av MSAL-biblioteket, för att skapa en klientapplikation. Det här steget initierar applikationen med viktiga referenser som klient-ID, klient-ID och klienthemlighet, som krävs för att generera en OAuth2-token. När applikationen har byggts hämtar metoden `AcquireTokenForClient()` den token som behövs för att autentisera med Outlooks SMTP-server. Genom att använda mekanismen `SaslMechanismOAuth2()` kan MailKit sedan autentisera e-postsändningsprocessen med denna token, och helt förbigå grundläggande autentisering. Denna metod säkerställer att applikationen följer moderna säkerhetsprotokoll och undviker föråldrade metoder.

I den andra lösningen används Microsoft Graph API för att skicka e-postmeddelanden utan att direkt interagera med SMTP-servern. Microsoft Graph tillhandahåller en allt-i-ett-lösning för att hantera Microsoft-tjänster, inklusive Outlook-e-post. Graph API utnyttjar OAuth2-autentisering genom `DelegateAuthenticationProvider()`, som tilldelar en OAuth2-token till varje begäran. Denna token genereras på liknande sätt med MSAL. "GraphServiceClient"-objektet underlättar säker kommunikation med Microsofts servrar, vilket gör att API:et kan skicka e-post sömlöst. Den här metoden är särskilt användbar för dem som vill hantera en bredare uppsättning Microsoft-tjänster med färre direktanslutningar till enskilda tjänster som SMTP.

Slutligen, i den tredje lösningen, utforskade vi ett mer traditionellt tillvägagångssätt med den inbyggda System.Net.Mail namnutrymme för .NET. Även om den fortfarande använder OAuth2 för autentisering, ersätter den här metoden MailKit med System.Net.Mails SMTP-klient för att skicka e-post. OAuth2-token skickas in som en autentiseringsinformation istället för den vanliga kombinationen av användarnamn och lösenord. E-postmeddelandet är konstruerat och skickat med de typiska `MailMessage`- och `SmtpClient`-objekten. Detta tillvägagångssätt kan vara användbart för utvecklare som föredrar att arbeta med inhemska .NET-bibliotek men som fortfarande kräver säker OAuth2-autentisering för att skicka e-post.

Alla dessa metoder löser inte bara problemet med att grundläggande autentisering är inaktiverad utan också framtidssäkrar e-postsändningsfunktionen i ditt ASP.NET Core Web API. Varje lösning lyfter fram vikten av säkerhet genom OAuth2, som ersätter föråldrade och mindre säkra autentiseringsmetoder. Genom att utnyttja moderna autentiseringsbibliotek som MSAL och Microsoft Graph kan utvecklare säkerställa att deras applikationer förblir kompatibla med de senaste säkerhetsstandarderna, samtidigt som de erbjuder tillförlitliga e-postsändningsmöjligheter.

Lösning 1: Byt till OAuth2 för Outlook-autentisering

Detta tillvägagångssätt använder ASP.NET Core och MailKit, och ersätter grundläggande autentisering med OAuth2, vilket är den rekommenderade metoden för säker e-postsändning i 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ösning 2: Använda Microsoft Graph API för att skicka e-post

Den här metoden innebär att Microsoft Graph API används för att skicka e-postmeddelanden från en ASP.NET Core-backend, och helt kringgå SMTP-konfigurationen.

// 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ösning 3: Använda OAuth2 med SMTP (Annorlunda bibliotek)

Detta tillvägagångssätt använder System.Net.Mail för att skicka e-postmeddelanden med OAuth2, istället för MailKit, med samma OAuth-autentiseringsmetod.

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

Implementering av moderna säkerhetsstandarder för e-postsändning

I samband med moderna e-postsystem ses grundläggande autentisering alltmer som föråldrad och osäker. Detta gäller särskilt för stora tjänsteleverantörer som Outlook, som har inaktiverat grundläggande autentisering för att genomdriva säkrare mekanismer som OAuth2. Grundläggande autentisering, som enbart förlitar sig på ett användarnamn och lösenord, är sårbart för brute force-attacker och kan äventyras om referenser stjäls. Att byta till OAuth2, som Microsoft uppmuntrar, säkerställer därför att tokens utbyts säkert utan att användarens autentiseringsuppgifter exponeras.

En avgörande aspekt av att implementera OAuth2 är konceptet med åtkomsttokens. Istället för att förlita sig på direkt autentisering via SMTP-servrar, utfärdar OAuth2 tidsbundna tokens som tillåter säker åtkomst till resurser som e-posttjänster. Dessa tokens beviljas av en auktoriseringsserver och utvecklare kan få dem med hjälp av bibliotek som Microsoft Identity Client (MSAL). Med dessa tokens får applikationer begränsad åtkomst till användarens konto, vilket minskar riskerna förknippade med långvariga, statiska autentiseringsuppgifter.

Att använda OAuth2 anpassar dessutom inte bara din applikation till modern säkerhetspraxis utan förbereder den också för framtida utveckling. Många API:er, inklusive de för molnbaserade tjänster, är nu starkt beroende av OAuth2 för säker kommunikation. Detta säkerställer att e-postsändningsfunktionen förblir funktionell och säker när tjänsterna utvecklas. För utvecklare som integrerar MailKit med ASP.NET Core, att använda OAuth2 ger en rad säkerhetsförbättringar, från token-baserad autentisering till krypterade överföringar via protokoll som STARTTLS.

Vanliga frågor om Outlook-autentisering i ASP.NET Core

  1. Vad orsakar 535: 5.7.139-felet i Outlook?
  2. Det här felet uppstår eftersom grundläggande autentisering är inaktiverad för Outlooks SMTP-server. Microsoft kräver nu OAuth2 för säker autentisering.
  3. Hur kan jag aktivera OAuth2 i MailKit?
  4. Du kan implementera OAuth2 genom att använda ConfidentialClientApplicationBuilder.Create() för att konfigurera din applikation och SaslMechanismOAuth2() för att autentisera e-postsändning med tokens.
  5. Vad är alternativet till grundläggande autentisering för att skicka e-post i Outlook?
  6. OAuth2 är det föredragna alternativet. Den använder tokens istället för användarnamn och lösenord för säker, tidsbegränsad autentisering.
  7. Är Microsoft Graph API bättre än att använda SMTP för att skicka e-post?
  8. Microsoft Graph API är en bredare tjänst som kan hantera mer än att bara skicka e-post. Det är mer mångsidigt och rekommenderas om du behöver tillgång till olika Microsoft 365-resurser.
  9. Hur testar jag om OAuth2 fungerar korrekt i min applikation?
  10. Du kan implementera enhetstester för att verifiera att dina OAuth2-tokens genereras och skickas korrekt till e-postsändningstjänsten.

Slutliga tankar om Outlook-autentisering med ASP.NET Core

För att lösa det grundläggande autentiseringsfelet i Outlook måste moderna säkerhetsstandarder som OAuth2 antas. Detta tillvägagångssätt eliminerar sårbarheterna med grundläggande autentisering och ger en säkrare metod för att skicka meddelanden via Outlooks SMTP-server.

Genom att integrera OAuth2 med ASP.NET Core och MailKit kan utvecklare framtidssäkra sina applikationer, säkerställa säker kommunikation och överensstämmelse med uppdaterade krav på tjänsteleverantörer. Detta löser inte bara autentiseringsproblemet utan förbättrar också den övergripande säkerheten och funktionaliteten.

Källor och referenser för Outlook-autentiseringsproblem
  1. Detaljerad dokumentation om Microsofts utfasning av grundläggande autentisering och OAuth2-implementering: Microsoft Exchange Online Basic Auth utfasning
  2. Omfattande guide om hur du använder MailKit och MimeKit i .NET för e-postfunktioner: MailKit-dokumentation
  3. MSAL (Microsoft Identity Client) biblioteksdokumentation för OAuth2-autentisering: Microsoft Identity Platform (MSAL) Översikt