Memperbaiki Masalah Otentikasi Sederhana di Outlook Menggunakan MailKit dan ASP.NET Core Web API

OAuth2

Memahami Masalah Otentikasi Outlook dengan ASP.NET Core dan MailKit

Saat mengintegrasikan fungsionalitas email Outlook ke dalam menggunakan MailKit, pengembang sering mengalami masalah otentikasi. Salah satu masalah umum adalah pesan kesalahan "535: 5.7.139 Otentikasi gagal". Hal ini biasanya terjadi ketika metode autentikasi dasar dinonaktifkan di server Outlook, sehingga menyebabkan upaya sambungan gagal.

Otentikasi dasar, yang dulu banyak digunakan, kini semakin banyak dinonaktifkan oleh penyedia layanan seperti Microsoft untuk meningkatkan keamanan. Sebaliknya, metode autentikasi modern, seperti OAuth2, lebih disukai. Pergeseran ini dapat menimbulkan kebingungan, terutama bagi pengembang yang terbiasa menggunakan nama pengguna dan kata sandi secara langsung.

Dalam skenario ini, Anda mungkin telah menggunakan pengaturan server SMTP Outlook yang benar dan kata sandi khusus aplikasi, namun masih menghadapi kesalahan autentikasi. Memahami mengapa autentikasi dasar gagal sangat penting untuk menyelesaikan masalah ini secara efisien. Kesalahan ini menunjukkan penerapan kebijakan keamanan, bukan masalah pada kode itu sendiri.

Dalam artikel ini, kita akan membahas mengapa kesalahan ini terjadi, penyebab utamanya, dan langkah-langkah yang dapat Anda ambil untuk mengatasi masalah tersebut. Kami juga akan membahas metode autentikasi alternatif, seperti OAuth2, untuk memastikan komunikasi yang aman dan sukses dengan server Outlook.

Memerintah Contoh penggunaan
ConfidentialClientApplicationBuilder.Create() Perintah ini digunakan untuk membangun aplikasi klien rahasia untuk otentikasi OAuth2. Ini adalah bagian dari pustaka Microsoft Identity Client (MSAL) dan menginisialisasi aplikasi dengan ID klien, sehingga memungkinkannya memperoleh token untuk komunikasi yang aman.
SaslMechanismOAuth2() Perintah ini khusus untuk MailKit dan digunakan untuk mengautentikasi dengan token OAuth2 saat mengirim email. Ini melewati otentikasi dasar dengan menggunakan metode yang lebih aman melalui protokol OAuth2.
AcquireTokenForClient(scopes).ExecuteAsync() Metode ini memperoleh token OAuth2 untuk aplikasi klien. Ini adalah bagian dari perpustakaan MSAL dan penting untuk menghasilkan token akses untuk API seperti server Microsoft Graph atau SMTP.
GraphServiceClient Objek ini digunakan di Microsoft Graph API untuk berinteraksi dengan layanan Microsoft. Hal ini memungkinkan pengembang mengirim email, mengelola pengguna, atau berinteraksi dengan sumber daya lain di Microsoft 365 menggunakan token OAuth2.
DelegateAuthenticationProvider() Perintah ini digunakan untuk menyiapkan proses autentikasi untuk permintaan Microsoft Graph API. Ini menetapkan token OAuth2 untuk setiap permintaan API secara dinamis, memastikan komunikasi yang aman.
SendMail(message, false).Request().PostAsync() Perintah ini adalah bagian dari Graph API yang mengirimkan pesan email yang dibuat secara asinkron. Ini memposting pesan ke kotak surat pengguna menggunakan fungsi pengiriman email aman Microsoft Graph.
SmtpClient.AuthenticateAsync() Di MailKit, perintah ini memungkinkan klien untuk mengautentikasi dengan server email menggunakan kredensial seperti token OAuth2. Ini menggantikan metode otentikasi nama pengguna dan kata sandi tradisional.
SecureSocketOptions.StartTls Perintah ini digunakan saat menyambung ke server SMTP untuk menerapkan sambungan terenkripsi yang aman melalui protokol STARTTLS, memastikan bahwa data ditransfer dengan aman melalui jaringan.
MimeMessage Kelas ini mewakili pesan email di perpustakaan MailKit. Ini berisi detail seperti pengirim, penerima, subjek, dan isi email. Penting untuk membuat dan memformat konten email sebelum dikirim.

Menjelajahi Integrasi OAuth2 untuk Pengiriman Email yang Aman

Skrip yang disediakan di atas dirancang untuk mengatasi ditemui saat mengirim email melalui server SMTP Outlook menggunakan MailKit di ASP.NET Core Web API. Kesalahan ini terjadi karena Microsoft telah menonaktifkan autentikasi dasar untuk meningkatkan keamanan, sehingga memaksa pengembang untuk mengadopsi OAuth2, metode autentikasi yang lebih aman. Pada solusi pertama, kami menggunakan MailKit dengan token OAuth2 untuk mengautentikasi dan mengirim email. Daripada mengandalkan nama pengguna dan kata sandi, OAuth2 memerlukan token, yang dihasilkan oleh Microsoft Identity Client (MSAL) dan digunakan untuk mengautentikasi permintaan dengan aman.

Untuk memulainya, solusinya menggunakan metode `ConfidentialClientApplicationBuilder.Create()`, bagian dari perpustakaan MSAL, untuk membuat aplikasi klien. Langkah ini menginisialisasi aplikasi dengan kredensial penting seperti ID klien, ID penyewa, dan rahasia klien, yang diperlukan untuk menghasilkan token OAuth2. Setelah aplikasi dibuat, metode `AcquireTokenForClient()` mengambil token yang diperlukan untuk mengautentikasi dengan server SMTP Outlook. Dengan menggunakan mekanisme `SaslMechanismOAuth2()`, MailKit kemudian dapat mengautentikasi proses pengiriman email menggunakan token ini, sepenuhnya melewati autentikasi dasar. Metode ini memastikan bahwa aplikasi mematuhi protokol keamanan modern dan menghindari metode yang tidak digunakan lagi.

Pada solusi kedua, Microsoft Graph API digunakan untuk mengirim email tanpa berinteraksi langsung dengan server SMTP. Microsoft Graph menyediakan solusi lengkap untuk mengelola layanan Microsoft, termasuk email Outlook. Graph API memanfaatkan autentikasi OAuth2 melalui `DelegateAuthenticationProvider()`, yang menetapkan token OAuth2 untuk setiap permintaan. Token ini dibuat dengan cara yang sama menggunakan MSAL. Objek `GraphServiceClient` memfasilitasi komunikasi aman dengan server Microsoft, memungkinkan API mengirim email dengan lancar. Metode ini sangat berguna bagi mereka yang ingin menangani rangkaian layanan Microsoft yang lebih luas dengan koneksi langsung yang lebih sedikit ke layanan individual seperti SMTP.

Terakhir, pada solusi ketiga, kami mengeksplorasi pendekatan yang lebih tradisional menggunakan solusi bawaan ruang nama .NET. Meskipun masih menggunakan OAuth2 untuk autentikasi, metode ini menggantikan MailKit dengan klien SMTP System.Net.Mail untuk mengirim email. Token OAuth2 diteruskan sebagai kredensial, bukan kombinasi nama pengguna dan kata sandi biasa. Email dibuat dan dikirim menggunakan objek `MailMessage` dan `SmtpClient` yang khas. Pendekatan ini dapat berguna bagi pengembang yang lebih suka bekerja dengan pustaka .NET asli namun masih memerlukan autentikasi OAuth2 yang aman untuk mengirim email.

Semua metode ini tidak hanya menyelesaikan masalah autentikasi dasar yang dinonaktifkan tetapi juga membuktikan fungsionalitas pengiriman email di ASP.NET Core Web API Anda di masa depan. Setiap solusi menyoroti pentingnya keamanan melalui OAuth2, menggantikan metode autentikasi yang ketinggalan jaman dan kurang aman. Dengan memanfaatkan pustaka autentikasi modern seperti MSAL dan Microsoft Graph, pengembang dapat memastikan aplikasi mereka tetap mematuhi standar keamanan terbaru, sekaligus tetap menawarkan kemampuan pengiriman email yang andal.

Solusi 1: Beralih ke OAuth2 untuk Otentikasi Outlook

Pendekatan ini menggunakan ASP.NET Core dan MailKit, menggantikan autentikasi dasar dengan OAuth2, yang merupakan metode yang disarankan untuk pengiriman email aman di 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);
}

Solusi 2: Menggunakan Microsoft Graph API untuk Mengirim Email

Metode ini melibatkan penggunaan Microsoft Graph API untuk mengirim email dari backend ASP.NET Core, melewati konfigurasi SMTP sepenuhnya.

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

Solusi 3: Menggunakan OAuth2 dengan SMTP (Perpustakaan Berbeda)

Pendekatan ini menggunakan System.Net.Mail untuk mengirim email dengan OAuth2, bukan MailKit, dengan metode autentikasi OAuth yang sama.

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

Menerapkan Standar Keamanan Modern untuk Pengiriman Email

Dalam konteks sistem email modern, autentikasi dasar semakin dianggap ketinggalan jaman dan tidak aman. Hal ini terutama berlaku untuk penyedia layanan besar seperti Outlook, yang telah menonaktifkan autentikasi dasar untuk menerapkan mekanisme yang lebih aman seperti OAuth2. Otentikasi dasar, yang hanya mengandalkan nama pengguna dan kata sandi, rentan terhadap serangan brute force dan dapat disusupi jika kredensial dicuri. Oleh karena itu, peralihan ke OAuth2, seperti yang didorong oleh Microsoft, memastikan bahwa token dipertukarkan dengan aman tanpa mengekspos kredensial pengguna.

Salah satu aspek penting dalam penerapan OAuth2 adalah konsep token akses. Daripada mengandalkan autentikasi langsung melalui server SMTP, OAuth2 mengeluarkan token terikat waktu yang memungkinkan akses aman ke sumber daya seperti layanan email. Token ini diberikan oleh server otorisasi, dan pengembang bisa mendapatkannya menggunakan perpustakaan seperti Microsoft Identity Client (MSAL). Dengan token ini, aplikasi mendapatkan akses terbatas ke akun pengguna, sehingga mengurangi risiko yang terkait dengan kredensial statis yang berkepanjangan.

Selain itu, penerapan OAuth2 tidak hanya menyelaraskan aplikasi Anda dengan praktik keamanan modern namun juga mempersiapkannya untuk pengembangan di masa depan. Banyak API, termasuk API untuk layanan berbasis cloud, kini sangat bergantung pada OAuth2 untuk komunikasi yang aman. Hal ini memastikan bahwa fungsi pengiriman email tetap berfungsi dan aman seiring berkembangnya layanan. Untuk pengembang yang berintegrasi dengan , memanfaatkan OAuth2 menghadirkan serangkaian peningkatan keamanan, mulai dari autentikasi berbasis token hingga transmisi terenkripsi melalui protokol seperti STARTTLS.

  1. Apa yang menyebabkan kesalahan 535: 5.7.139 di Outlook?
  2. Kesalahan ini terjadi karena autentikasi dasar dinonaktifkan untuk server SMTP Outlook. Microsoft sekarang memerlukan OAuth2 untuk autentikasi yang aman.
  3. Bagaimana cara mengaktifkan OAuth2 di MailKit?
  4. Anda dapat mengimplementasikan OAuth2 dengan menggunakan untuk mengonfigurasi aplikasi Anda dan untuk mengautentikasi pengiriman email dengan token.
  5. Apa alternatif otentikasi dasar untuk mengirim email di Outlook?
  6. OAuth2 adalah alternatif yang lebih disukai. Ia menggunakan token alih-alih nama pengguna dan kata sandi untuk autentikasi yang aman dan terbatas waktu.
  7. Apakah Microsoft Graph API lebih baik daripada menggunakan SMTP untuk mengirim email?
  8. Microsoft Graph API adalah layanan yang lebih luas yang dapat menangani lebih dari sekadar mengirim email. Ini lebih serbaguna dan direkomendasikan jika Anda memerlukan akses ke berbagai sumber daya Microsoft 365.
  9. Bagaimana cara menguji apakah OAuth2 berfungsi dengan benar di aplikasi saya?
  10. Anda dapat menerapkan pengujian unit untuk memverifikasi bahwa token OAuth2 Anda dibuat dan diteruskan dengan benar ke layanan pengiriman email.

Menyelesaikan kesalahan autentikasi dasar di Outlook memerlukan penerapan standar keamanan modern seperti OAuth2. Pendekatan ini menghilangkan kerentanan otentikasi dasar dan menyediakan metode yang lebih aman untuk mengirim pesan melalui server SMTP Outlook.

Dengan mengintegrasikan OAuth2 dengan ASP.NET Core dan MailKit, pengembang dapat mempersiapkan aplikasi mereka di masa depan, memastikan komunikasi yang aman dan kepatuhan terhadap persyaratan penyedia layanan terbaru. Ini tidak hanya menyelesaikan masalah autentikasi tetapi juga meningkatkan keamanan dan fungsionalitas secara keseluruhan.

  1. Dokumentasi mendetail tentang penghentian autentikasi dasar dan penerapan OAuth2 oleh Microsoft: Penghentian Otentikasi Dasar Microsoft Exchange Online
  2. Panduan komprehensif tentang penggunaan MailKit dan MimeKit di .NET untuk fungsi email: Dokumentasi MailKit
  3. Dokumentasi pustaka MSAL (Microsoft Identity Client) untuk autentikasi OAuth2: Ikhtisar Platform Identitas Microsoft (MSAL).