Paprastų autentifikavimo problemų sprendimas programoje Outlook naudojant MailKit ir ASP.NET Core Web API

OAuth2

„Outlook“ autentifikavimo problemų supratimas naudojant ASP.NET Core ir MailKit

Integruojant „Outlook“ el. pašto funkcijas į Naudodami MailKit kūrėjai dažnai susiduria su autentifikavimo problemomis. Viena dažna problema yra klaidos pranešimas „535: 5.7.139 Autentifikavimas nepavyko“. Paprastai taip nutinka, kai pagrindinis autentifikavimo metodas yra išjungtas Outlook serveryje, todėl nepavyksta prisijungti.

Pagrindinį autentifikavimą, kadaise plačiai naudojamą, paslaugų teikėjai, tokie kaip „Microsoft“, vis dažniau išjungia, kad padidintų saugumą. Vietoj to pirmenybė teikiama šiuolaikiniams autentifikavimo metodams, pvz., OAuth2. Šis pakeitimas gali sukelti painiavą, ypač kūrėjams, įpratusiems tiesiogiai naudoti vartotojo vardus ir slaptažodžius.

Pagal šį scenarijų galbūt naudojote teisingus Outlook SMTP serverio nustatymus ir konkrečios programos slaptažodį, tačiau vis tiek susidūrėte su autentifikavimo klaidomis. Norint veiksmingai išspręsti šias problemas, labai svarbu suprasti, kodėl nepavyksta pagrindinis autentifikavimas. Klaida rodo saugumo politikos vykdymą, o ne paties kodo problemą.

Šiame straipsnyje išnagrinėsime, kodėl atsiranda ši klaida, pagrindines priežastis ir veiksmus, kurių galite imtis norėdami išspręsti problemą. Taip pat aptarsime alternatyvius autentifikavimo metodus, tokius kaip OAuth2, kad būtų užtikrintas saugus ir sėkmingas ryšys su Outlook serveriais.

komandą Naudojimo pavyzdys
ConfidentialClientApplicationBuilder.Create() Ši komanda naudojama kuriant konfidencialią kliento programą, skirtą OAuth2 autentifikavimui. Tai yra „Microsoft Identity Client“ (MSAL) bibliotekos dalis ir inicijuoja programą naudodama kliento ID, leidžiančią jai gauti saugaus ryšio prieigos raktus.
SaslMechanismOAuth2() Ši komanda būdinga MailKit ir naudojama autentifikuoti naudojant OAuth2 prieigos raktą siunčiant el. Jis apeina pagrindinį autentifikavimą, naudodamas saugesnį metodą per OAuth2 protokolą.
AcquireTokenForClient(scopes).ExecuteAsync() Šis metodas įgyja OAuth2 prieigos raktą kliento programai. Tai yra MSAL bibliotekos dalis ir būtina kuriant API prieigos raktus, pvz., Microsoft Graph arba SMTP serverius.
GraphServiceClient Šis objektas naudojamas Microsoft Graph API sąveikauti su Microsoft paslaugomis. Tai leidžia kūrėjams siųsti el. laiškus, tvarkyti vartotojus arba bendrauti su kitais „Microsoft 365“ ištekliais naudojant OAuth2 prieigos raktus.
DelegateAuthenticationProvider() Ši komanda naudojama autentifikavimo procesui nustatyti Microsoft Graph API užklausoms. Kiekvienai API užklausai jis dinamiškai priskiria OAuth2 prieigos raktą, užtikrindamas saugų ryšį.
SendMail(message, false).Request().PostAsync() Ši komanda yra Graph API dalis, kuri siunčia sukurtą el. pašto pranešimą asinchroniškai. Jis paskelbia pranešimą į vartotojo pašto dėžutę naudodamas „Microsoft Graph“ saugaus el. pašto siuntimo funkciją.
SmtpClient.AuthenticateAsync() „MailKit“ ši komanda leidžia klientui autentifikuoti el. pašto serverį naudojant kredencialus, tokius kaip OAuth2 prieigos raktai. Jis pakeičia tradicinį vartotojo vardo ir slaptažodžio autentifikavimo metodą.
SecureSocketOptions.StartTls Ši komanda naudojama jungiantis prie SMTP serverio, siekiant užtikrinti saugų, užšifruotą ryšį naudojant STARTTLS protokolą, užtikrinant, kad duomenys būtų saugiai perduodami tinkle.
MimeMessage Ši klasė reiškia el. laišką MailKit bibliotekoje. Jame pateikiama tokia informacija kaip siuntėjas, gavėjas, tema ir el. laiško turinys. Tai būtina norint sukurti ir formatuoti el. pašto turinį prieš siunčiant.

Saugaus el. pašto siuntimo OAuth2 integravimo tyrinėjimas

Aukščiau pateikti scenarijai yra skirti spręsti susidurta siunčiant el. laiškus per Outlook SMTP serverį naudojant MailKit ASP.NET Core Web API. Klaida atsiranda dėl to, kad „Microsoft“ išjungė pagrindinį autentifikavimą, kad padidintų saugumą, todėl kūrėjai buvo priversti naudoti OAuth2 – saugesnį autentifikavimo metodą. Pirmajame sprendime naudojome „MailKit“ su „OAuth2“ prieigos raktais autentifikuoti ir išsiųsti el. Užuot pasikliavę naudotojo vardu ir slaptažodžiu, OAuth2 reikalauja prieigos rakto, kurį generuoja „Microsoft Identity Client“ (MSAL) ir kuris naudojamas saugiai užklausoms autentifikuoti.

Pirmiausia sprendimas naudoja metodą „ConfidentialClientApplicationBuilder.Create()“, kuris yra MSAL bibliotekos dalis, kad būtų sukurta kliento programa. Atliekant šį veiksmą programa inicijuojama naudojant esminius kredencialus, pvz., kliento ID, nuomininko ID ir kliento paslaptį, kurių reikia norint sugeneruoti OAuth2 prieigos raktą. Sukūrus programą, metodas „AcquireTokenForClient()“ nuskaito prieigos raktą, reikalingą autentifikuoti naudojant „Outlook“ SMTP serverį. Naudodamas „SaslMechanismOAuth2()“ mechanizmą, „MailKit“ gali autentifikuoti el. pašto siuntimo procesą naudodamas šį prieigos raktą, visiškai apeidamas pagrindinį autentifikavimą. Šis metodas užtikrina, kad programa laikytųsi šiuolaikinių saugos protokolų ir išvengtų pasenusių metodų.

Antrajame sprendime Microsoft Graph API naudojama el. laiškams siųsti be tiesioginio sąveikos su SMTP serveriu. „Microsoft Graph“ teikia „viskas viename“ sprendimą, skirtą „Microsoft“ paslaugoms, įskaitant „Outlook“ el. Graph API naudoja OAuth2 autentifikavimą per „DelegateAuthenticationProvider()“, kuris kiekvienai užklausai priskiria OAuth2 prieigos raktą. Šis prieigos raktas generuojamas panašiai naudojant MSAL. Objektas „GraphServiceClient“ palengvina saugų ryšį su „Microsoft“ serveriais, leisdamas API sklandžiai siųsti el. Šis metodas ypač naudingas tiems, kurie nori naudoti platesnį „Microsoft“ paslaugų rinkinį su mažiau tiesioginių jungčių su atskiromis paslaugomis, pvz., SMTP.

Galiausiai, trečiajame sprendime mes ištyrėme tradicinį metodą, naudodami integruotą .NET vardų sritis. Nors autentifikavimui vis dar naudojamas OAuth2, šiuo metodu MailKit pakeičiamas System.Net.Mail SMTP klientu el. laiškams siųsti. OAuth2 prieigos raktas perduodamas kaip kredencialas, o ne įprastas vartotojo vardo ir slaptažodžio derinys. Laiškas kuriamas ir siunčiamas naudojant įprastus „MailMessage“ ir „SmtpClient“ objektus. Šis metodas gali būti naudingas kūrėjams, kurie nori dirbti su vietinėmis .NET bibliotekomis, bet vis tiek reikalauja saugaus OAuth2 autentifikavimo siųsdami el.

Visi šie metodai ne tik išsprendžia pagrindinio autentifikavimo išjungimo problemą, bet ir ateityje apsaugo el. laiškų siuntimo funkciją jūsų ASP.NET Core Web API. Kiekvienas sprendimas pabrėžia saugumo svarbą naudojant OAuth2, pakeičiantį pasenusius ir mažiau saugius autentifikavimo metodus. Naudodami modernias autentifikavimo bibliotekas, tokias kaip MSAL ir Microsoft Graph, kūrėjai gali užtikrinti, kad jų programos atitiktų naujausius saugos standartus, kartu siūlydami patikimas el. laiškų siuntimo galimybes.

1 sprendimas: perjunkite į „OAuth2“, skirtą „Outlook“ autentifikavimui

Šis metodas naudoja ASP.NET Core ir MailKit, pakeičiant pagrindinį autentifikavimą OAuth2, kuris yra rekomenduojamas saugaus el. pašto siuntimo būdas programoje "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);
}

2 sprendimas: naudokite Microsoft Graph API el. laiškams siųsti

Šis metodas apima Microsoft Graph API naudojimą siunčiant el. laiškus iš ASP.NET Core backend, visiškai apeinant SMTP konfigūraciją.

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

3 sprendimas: OAuth2 naudojimas su SMTP (skirtinga biblioteka)

Šis metodas naudoja System.Net.Mail el. laiškams siųsti naudojant OAuth2, o ne MailKit, naudojant tą patį OAuth autentifikavimo metodą.

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

Šiuolaikinių elektroninių laiškų siuntimo saugos standartų diegimas

Šiuolaikinių el. pašto sistemų kontekste pagrindinis autentifikavimas vis dažniau laikomas pasenusiu ir nesaugiu. Tai ypač pasakytina apie pagrindinius paslaugų teikėjus, tokius kaip „Outlook“, kurie išjungė pagrindinį autentifikavimą, kad užtikrintų saugesnius mechanizmus, pvz., „OAuth2“. Pagrindinis autentifikavimas, kuris priklauso tik nuo vartotojo vardo ir slaptažodžio, yra pažeidžiamas žiaurios jėgos atakų ir gali būti pažeistas pavagius kredencialus. Todėl perėjimas prie OAuth2, kaip skatina „Microsoft“, užtikrina, kad prieigos raktai būtų keičiami saugiai, neatskleidžiant vartotojo kredencialų.

Vienas iš esminių OAuth2 diegimo aspektų yra prieigos prieigos raktų koncepcija. Užuot pasikliavę tiesioginiu autentifikavimu per SMTP serverius, OAuth2 išduoda su laiku susietus prieigos raktus, leidžiančius saugiai pasiekti išteklius, pvz., el. pašto paslaugas. Šiuos prieigos raktus suteikia prieigos teisės serveris, o kūrėjai gali juos gauti naudodami bibliotekas, pvz., Microsoft Identity Client (MSAL). Naudojant šiuos žetonus, programos įgyja ribotą prieigą prie vartotojo paskyros, todėl sumažėja rizika, susijusi su ilgalaikiais, statiniais kredencialais.

Be to, pritaikius OAuth2 jūsų programa ne tik suderinama su šiuolaikine saugos praktika, bet ir paruošiama būsimiems tobulinimams. Daugelis API, įskaitant skirtas debesimis pagrįstoms paslaugoms, dabar labai priklauso nuo OAuth2, kad užtikrintų saugų ryšį. Tai užtikrina, kad el. laiškų siuntimo funkcija išliks funkcionali ir saugi, kai paslaugos vystosi. Integruojantiems kūrėjams su , naudojant OAuth2, suteikiama daugybė saugumo patobulinimų, pradedant autentifikavimu žetonu ir baigiant šifruotu perdavimu naudojant tokius protokolus kaip STARTTLS.

  1. Kas sukelia 535: 5.7.139 klaidą programoje „Outlook“?
  2. Ši klaida atsiranda, nes pagrindinis „Outlook“ SMTP serverio autentifikavimas išjungtas. „Microsoft“ dabar reikalauja OAuth2 saugiam autentifikavimui.
  3. Kaip „MailKit“ įjungti „OAuth2“?
  4. Galite įdiegti OAuth2 naudodami norėdami sukonfigūruoti programą ir pašto siuntimo autentifikavimui naudojant žetonus.
  5. Kokia alternatyva pagrindiniam autentifikavimui siunčiant el. laiškus programoje „Outlook“?
  6. OAuth2 yra pageidaujama alternatyva. Jis naudoja žetonus, o ne vartotojo vardus ir slaptažodžius, kad būtų užtikrintas saugus, riboto laiko autentifikavimas.
  7. Ar Microsoft Graph API geriau nei SMTP naudojimas el. laiškų siuntimui?
  8. „Microsoft Graph“ API yra platesnė paslauga, galinti ne tik siųsti el. Jis yra universalesnis ir rekomenduojamas, jei jums reikia prieigos prie įvairių „Microsoft 365“ išteklių.
  9. Kaip patikrinti, ar OAuth2 tinkamai veikia mano programoje?
  10. Galite įdiegti vienetų testus, kad patikrintumėte, ar jūsų OAuth2 prieigos raktai generuojami ir tinkamai perduodami el. pašto siuntimo paslaugai.

Norint išspręsti pagrindinę „Outlook“ autentifikavimo klaidą, reikia pritaikyti šiuolaikinius saugos standartus, tokius kaip „OAuth2“. Šis metodas pašalina pagrindinio autentifikavimo pažeidžiamumą ir suteikia saugesnį būdą siųsti pranešimus per „Outlook“ SMTP serverį.

Integruodami OAuth2 su ASP.NET Core ir MailKit, kūrėjai gali apsaugoti savo programas ateityje, užtikrindami saugų ryšį ir atitikimą atnaujintiems paslaugų teikėjų reikalavimams. Tai ne tik išsprendžia autentifikavimo problemą, bet ir padidina bendrą saugumą bei funkcionalumą.

  1. Išsami dokumentacija apie „Microsoft“ pagrindinio autentifikavimo ir „OAuth2“ diegimo panaikinimą: „Microsoft Exchange Online Basic Auth“ panaikinimas
  2. Išsamus „MailKit“ ir „MimeKit“ naudojimo .NET el. pašto funkcijoms vadovas: MailKit dokumentacija
  3. MSAL („Microsoft Identity Client“) bibliotekos dokumentacija, skirta OAuth2 autentifikavimui: „Microsoft Identity Platform“ (MSAL) apžvalga