Membetulkan Isu Pengesahan Mudah dalam Outlook Menggunakan MailKit dan API Web Teras ASP.NET

OAuth2

Memahami Isu Pengesahan Outlook dengan Teras ASP.NET dan MailKit

Apabila menyepadukan fungsi e-mel Outlook ke dalam menggunakan MailKit, pembangun sering menghadapi masalah pengesahan. Satu masalah biasa ialah mesej ralat "535: 5.7.139 Pengesahan tidak berjaya". Ini biasanya berlaku apabila kaedah pengesahan asas dilumpuhkan pada pelayan Outlook, menyebabkan percubaan sambungan gagal.

Pengesahan asas, setelah digunakan secara meluas, telah semakin dilumpuhkan oleh penyedia perkhidmatan seperti Microsoft untuk meningkatkan keselamatan. Sebaliknya, kaedah pengesahan moden, seperti OAuth2, lebih disukai. Anjakan ini boleh menyebabkan kekeliruan, terutamanya bagi pembangun yang biasa menggunakan nama pengguna dan kata laluan secara langsung.

Dalam senario ini, anda mungkin telah menggunakan tetapan pelayan SMTP Outlook yang betul dan kata laluan khusus apl, namun masih menghadapi ralat pengesahan. Memahami mengapa pengesahan asas gagal adalah penting untuk menyelesaikan isu ini dengan cekap. Ralat menunjukkan penguatkuasaan dasar keselamatan dan bukannya isu dengan kod itu sendiri.

Dalam artikel ini, kami akan meneroka sebab ralat ini berlaku, punca asas dan langkah yang boleh anda ambil untuk menyelesaikan isu tersebut. Kami juga akan membincangkan kaedah pengesahan alternatif, seperti OAuth2, untuk memastikan komunikasi yang selamat dan berjaya dengan pelayan Outlook.

Perintah Contoh penggunaan
ConfidentialClientApplicationBuilder.Create() Perintah ini digunakan untuk membina aplikasi klien sulit untuk pengesahan OAuth2. Ia merupakan sebahagian daripada pustaka Microsoft Identity Client (MSAL) dan memulakan apl dengan ID klien, membolehkannya memperoleh token untuk komunikasi yang selamat.
SaslMechanismOAuth2() Perintah ini khusus untuk MailKit dan digunakan untuk mengesahkan dengan token OAuth2 semasa menghantar e-mel. Ia memintas pengesahan asas dengan menggunakan kaedah yang lebih selamat melalui protokol OAuth2.
AcquireTokenForClient(scopes).ExecuteAsync() Kaedah ini memperoleh token OAuth2 untuk aplikasi klien. Ia adalah sebahagian daripada perpustakaan MSAL dan penting untuk menjana token akses untuk API seperti Microsoft Graph atau pelayan SMTP.
GraphServiceClient Objek ini digunakan dalam Microsoft Graph API untuk berinteraksi dengan perkhidmatan Microsoft. Ia membenarkan pembangun menghantar e-mel, mengurus pengguna atau berinteraksi dengan sumber lain dalam Microsoft 365 menggunakan token OAuth2.
DelegateAuthenticationProvider() Perintah ini digunakan untuk menyediakan proses pengesahan untuk permintaan Microsoft Graph API. Ia memberikan token OAuth2 kepada setiap permintaan API secara dinamik, memastikan komunikasi selamat.
SendMail(message, false).Request().PostAsync() Perintah ini adalah sebahagian daripada API Graf yang menghantar mesej e-mel yang dibina secara tidak segerak. Ia menyiarkan mesej ke peti mel pengguna menggunakan fungsi penghantaran e-mel selamat Microsoft Graph.
SmtpClient.AuthenticateAsync() Dalam MailKit, arahan ini membenarkan klien untuk mengesahkan dengan pelayan e-mel menggunakan bukti kelayakan seperti token OAuth2. Ia menggantikan kaedah pengesahan nama pengguna dan kata laluan tradisional.
SecureSocketOptions.StartTls Perintah ini digunakan semasa menyambung ke pelayan SMTP untuk menguatkuasakan sambungan yang selamat dan disulitkan melalui protokol STARTTLS, memastikan data dipindahkan dengan selamat melalui rangkaian.
MimeMessage Kelas ini mewakili mesej e-mel dalam pustaka MailKit. Ia mengandungi butiran seperti pengirim, penerima, subjek dan kandungan e-mel. Ia adalah penting untuk mencipta dan memformat kandungan e-mel sebelum menghantar.

Meneroka Integrasi OAuth2 untuk Penghantaran E-mel Selamat

Skrip yang disediakan di atas direka untuk menangani ditemui semasa menghantar e-mel melalui pelayan SMTP Outlook menggunakan MailKit dalam API Web Teras ASP.NET. Ralat berlaku kerana Microsoft telah melumpuhkan pengesahan asas untuk meningkatkan keselamatan, memaksa pembangun mengguna pakai OAuth2, kaedah pengesahan yang lebih selamat. Dalam penyelesaian pertama, kami menggunakan MailKit dengan token OAuth2 untuk mengesahkan dan menghantar e-mel. Daripada bergantung pada nama pengguna dan kata laluan, OAuth2 memerlukan token, yang dijana oleh Microsoft Identity Client (MSAL) dan digunakan untuk mengesahkan permintaan dengan selamat.

Sebagai permulaan, penyelesaian menggunakan kaedah `ConfidentialClientApplicationBuilder.Create()`, sebahagian daripada perpustakaan MSAL, untuk mencipta aplikasi klien. Langkah ini memulakan aplikasi dengan bukti kelayakan penting seperti ID pelanggan, ID penyewa dan rahsia pelanggan, yang diperlukan untuk menjana token OAuth2. Setelah aplikasi dibina, kaedah `AcquireTokenForClient()` mendapatkan semula token yang diperlukan untuk mengesahkan dengan pelayan SMTP Outlook. Dengan menggunakan mekanisme `SaslMechanismOAuth2()`, MailKit kemudiannya boleh mengesahkan proses penghantaran e-mel menggunakan token ini, memintas pengesahan asas sepenuhnya. Kaedah ini memastikan bahawa aplikasi mematuhi protokol keselamatan moden dan mengelakkan kaedah yang tidak digunakan lagi.

Dalam penyelesaian kedua, Microsoft Graph API digunakan untuk menghantar e-mel tanpa berinteraksi secara langsung dengan pelayan SMTP. Microsoft Graph menyediakan penyelesaian semua-dalam-satu untuk mengurus perkhidmatan Microsoft, termasuk e-mel Outlook. API Graf memanfaatkan pengesahan OAuth2 melalui `DelegateAuthenticationProvider()`, yang memberikan token OAuth2 kepada setiap permintaan. Token ini dijana sama menggunakan MSAL. Objek `GraphServiceClient` memudahkan komunikasi selamat dengan pelayan Microsoft, membolehkan API menghantar e-mel dengan lancar. Kaedah ini amat berguna untuk mereka yang ingin mengendalikan set perkhidmatan Microsoft yang lebih luas dengan sambungan langsung yang lebih sedikit kepada perkhidmatan individu seperti SMTP.

Akhir sekali, dalam penyelesaian ketiga, kami meneroka pendekatan yang lebih tradisional menggunakan terbina dalam ruang nama .NET. Walaupun masih menggunakan OAuth2 untuk pengesahan, kaedah ini menggantikan MailKit dengan klien SMTP System.Net.Mail untuk menghantar e-mel. Token OAuth2 diserahkan sebagai bukti kelayakan dan bukannya gabungan nama pengguna dan kata laluan biasa. E-mel dibina dan dihantar menggunakan objek `MailMessage` dan `SmtpClient` biasa. Pendekatan ini boleh berguna untuk pembangun yang lebih suka bekerja dengan perpustakaan .NET asli tetapi masih memerlukan pengesahan OAuth2 yang selamat untuk menghantar e-mel.

Semua kaedah ini bukan sahaja menyelesaikan isu pengesahan asas yang dilumpuhkan tetapi juga bukti masa depan fungsi penghantaran e-mel dalam API Web Teras ASP.NET anda. Setiap penyelesaian menyerlahkan kepentingan keselamatan melalui OAuth2, menggantikan kaedah pengesahan yang lapuk dan kurang selamat. Dengan memanfaatkan perpustakaan pengesahan moden seperti MSAL dan Microsoft Graph, pembangun boleh memastikan aplikasi mereka kekal mematuhi piawaian keselamatan terkini, sambil masih menawarkan keupayaan penghantaran e-mel yang boleh dipercayai.

Penyelesaian 1: Beralih kepada OAuth2 untuk Pengesahan Outlook

Pendekatan ini menggunakan ASP.NET Core dan MailKit, menggantikan pengesahan asas dengan OAuth2, yang merupakan kaedah yang disyorkan untuk penghantaran e-mel selamat dalam 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);
}

Penyelesaian 2: Menggunakan Microsoft Graph API untuk Menghantar E-mel

Kaedah ini melibatkan penggunaan Microsoft Graph API untuk menghantar e-mel daripada bahagian belakang Teras ASP.NET, memintas 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();

Penyelesaian 3: Menggunakan OAuth2 dengan SMTP (Perpustakaan Berbeza)

Pendekatan ini menggunakan System.Net.Mail untuk menghantar e-mel dengan OAuth2, bukannya MailKit, dengan kaedah pengesahan 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);

Melaksanakan Piawaian Keselamatan Moden untuk Penghantaran E-mel

Dalam konteks sistem e-mel moden, pengesahan asas semakin dilihat sebagai ketinggalan zaman dan tidak selamat. Ini adalah benar terutamanya untuk penyedia perkhidmatan utama seperti Outlook, yang telah melumpuhkan pengesahan asas untuk menguatkuasakan mekanisme yang lebih selamat seperti OAuth2. Pengesahan asas, yang bergantung semata-mata pada nama pengguna dan kata laluan, terdedah kepada serangan kekerasan dan boleh dikompromi jika bukti kelayakan dicuri. Oleh itu, beralih kepada OAuth2, seperti yang digalakkan oleh Microsoft, memastikan token ditukar dengan selamat tanpa mendedahkan kelayakan pengguna.

Satu aspek penting dalam melaksanakan OAuth2 ialah konsep token akses. Daripada bergantung pada pengesahan langsung melalui pelayan SMTP, OAuth2 mengeluarkan token terikat masa yang membenarkan akses selamat kepada sumber seperti perkhidmatan e-mel. Token ini diberikan oleh pelayan kebenaran dan pembangun boleh mendapatkannya menggunakan perpustakaan seperti Microsoft Identity Client (MSAL). Dengan token ini, aplikasi mendapat akses terhad kepada akaun pengguna, mengurangkan risiko yang berkaitan dengan bukti kelayakan statik yang berpanjangan.

Tambahan pula, penggunaan OAuth2 bukan sahaja menyelaraskan aplikasi anda dengan amalan keselamatan moden tetapi juga menyediakannya untuk perkembangan masa hadapan. Banyak API, termasuk untuk perkhidmatan berasaskan awan, kini sangat bergantung pada OAuth2 untuk komunikasi yang selamat. Ini memastikan bahawa fungsi penghantaran e-mel kekal berfungsi dan selamat apabila perkhidmatan berkembang. Untuk pemaju menyepadukan dengan , menggunakan OAuth2 membawa pelbagai peningkatan keselamatan, daripada pengesahan berasaskan token kepada penghantaran yang disulitkan melalui protokol seperti STARTTLS.

  1. Apakah yang menyebabkan ralat 535: 5.7.139 dalam Outlook?
  2. Ralat ini berlaku kerana pengesahan asas dilumpuhkan untuk pelayan SMTP Outlook. Microsoft kini memerlukan OAuth2 untuk pengesahan selamat.
  3. Bagaimanakah saya boleh mendayakan OAuth2 dalam MailKit?
  4. Anda boleh melaksanakan OAuth2 dengan menggunakan untuk mengkonfigurasi aplikasi anda dan untuk mengesahkan penghantaran e-mel dengan token.
  5. Apakah alternatif kepada pengesahan asas untuk menghantar e-mel dalam Outlook?
  6. OAuth2 ialah alternatif pilihan. Ia menggunakan token dan bukannya nama pengguna dan kata laluan untuk pengesahan yang selamat dan terhad masa.
  7. Adakah Microsoft Graph API lebih baik daripada menggunakan SMTP untuk menghantar e-mel?
  8. Microsoft Graph API ialah perkhidmatan yang lebih luas yang boleh mengendalikan lebih daripada sekadar menghantar e-mel. Ia lebih serba boleh dan disyorkan jika anda memerlukan akses kepada pelbagai sumber Microsoft 365.
  9. Bagaimanakah saya hendak menguji jika OAuth2 berfungsi dengan betul dalam aplikasi saya?
  10. Anda boleh melaksanakan ujian unit untuk mengesahkan bahawa token OAuth2 anda sedang dijana dan dihantar dengan betul kepada perkhidmatan penghantaran e-mel.

Menyelesaikan ralat pengesahan asas dalam Outlook memerlukan penggunaan piawaian keselamatan moden seperti OAuth2. Pendekatan ini menghapuskan kelemahan pengesahan asas dan menyediakan kaedah yang lebih selamat untuk menghantar mesej melalui pelayan SMTP Outlook.

Dengan menyepadukan OAuth2 dengan ASP.NET Core dan MailKit, pembangun boleh membuktikan aplikasi mereka pada masa hadapan, memastikan komunikasi selamat dan pematuhan dengan keperluan pembekal perkhidmatan yang dikemas kini. Ini bukan sahaja menyelesaikan isu pengesahan tetapi juga meningkatkan keselamatan dan kefungsian keseluruhan.

  1. Dokumentasi terperinci mengenai penamatan pengesahan asas Microsoft dan pelaksanaan OAuth2: Penamatan Pengesahan Asas Dalam Talian Microsoft Exchange
  2. Panduan komprehensif tentang menggunakan MailKit dan MimeKit dalam .NET untuk fungsi e-mel: Dokumentasi MailKit
  3. Dokumentasi perpustakaan MSAL (Microsoft Identity Client) untuk pengesahan OAuth2: Gambaran Keseluruhan Platform Identiti Microsoft (MSAL).