Porozumění problémům s ověřováním aplikace Outlook s ASP.NET Core a MailKit
Při integraci e-mailových funkcí aplikace Outlook do Webové rozhraní API ASP.NET Core pomocí MailKit se vývojáři často setkávají s problémy s ověřováním. Jedním z běžných problémů je chybová zpráva „535: 5.7.139 Authentication failed“. K tomu obvykle dochází, když je na serveru Outlook zakázána základní metoda ověřování, což způsobí selhání pokusu o připojení.
Základní autentizace, kdysi široce používaná, byla poskytovateli služeb, jako je Microsoft, stále více zakazována, aby se zvýšila bezpečnost. Místo toho jsou preferovány moderní metody ověřování, jako je OAuth2. Tento posun může způsobit zmatek, zejména u vývojářů zvyklých přímo používat uživatelská jména a hesla.
V tomto scénáři jste možná použili správná nastavení serveru SMTP aplikace Outlook a heslo pro konkrétní aplikaci, přesto jste stále čelili chybám ověřování. Pro efektivní řešení těchto problémů je zásadní pochopit, proč základní autentizace selhává. Chyba označuje vynucení zásad zabezpečení spíše než problém se samotným kódem.
V tomto článku prozkoumáme, proč k této chybě dochází, základní příčiny a kroky, které můžete podniknout k vyřešení problému. Probereme také alternativní metody ověřování, jako je OAuth2, abychom zajistili bezpečnou a úspěšnou komunikaci se servery aplikace Outlook.
Příkaz | Příklad použití |
---|---|
ConfidentialClientApplicationBuilder.Create() | Tento příkaz se používá k vytvoření důvěrné klientské aplikace pro ověřování OAuth2. Je součástí knihovny Microsoft Identity Client (MSAL) a inicializuje aplikaci pomocí ID klienta, což jí umožňuje získávat tokeny pro zabezpečenou komunikaci. |
SaslMechanismOAuth2() | Tento příkaz je specifický pro MailKit a používá se k ověření pomocí tokenu OAuth2 při odesílání e-mailů. Obchází základní autentizaci pomocí bezpečnější metody přes protokol OAuth2. |
AcquireTokenForClient(scopes).ExecuteAsync() | Tato metoda získává token OAuth2 pro klientskou aplikaci. Je součástí knihovny MSAL a je nezbytný pro generování přístupových tokenů pro rozhraní API, jako jsou servery Microsoft Graph nebo SMTP. |
GraphServiceClient | Tento objekt se používá v rozhraní Microsoft Graph API k interakci se službami společnosti Microsoft. Umožňuje vývojářům odesílat e-maily, spravovat uživatele nebo komunikovat s dalšími prostředky v Microsoft 365 pomocí tokenů OAuth2. |
DelegateAuthenticationProvider() | Tento příkaz se používá k nastavení procesu ověřování pro požadavky rozhraní Microsoft Graph API. Každému požadavku API dynamicky přiřazuje token OAuth2, čímž zajišťuje bezpečnou komunikaci. |
SendMail(message, false).Request().PostAsync() | Tento příkaz je součástí rozhraní Graph API, které asynchronně odesílá vytvořenou e-mailovou zprávu. Odešle zprávu do poštovní schránky uživatele pomocí funkce zabezpečeného odesílání e-mailů aplikace Microsoft Graph. |
SmtpClient.AuthenticateAsync() | V MailKitu tento příkaz umožňuje klientovi ověřit se u e-mailového serveru pomocí přihlašovacích údajů, jako jsou tokeny OAuth2. Nahrazuje tradiční metodu ověřování uživatelského jména a hesla. |
SecureSocketOptions.StartTls | Tento příkaz se používá při připojování k serveru SMTP k vynucení zabezpečeného, šifrovaného spojení prostřednictvím protokolu STARTTLS, který zajišťuje bezpečný přenos dat po síti. |
MimeMessage | Tato třída představuje e-mailovou zprávu v knihovně MailKit. Obsahuje podrobnosti, jako je odesílatel, příjemce, předmět a tělo e-mailu. Je nezbytný pro vytváření a formátování obsahu e-mailů před odesláním. |
Zkoumání integrace OAuth2 pro bezpečné odesílání e-mailů
Výše uvedené skripty jsou navrženy tak, aby řešily základní chyba ověření vyskytující se při odesílání e-mailů prostřednictvím serveru SMTP aplikace Outlook pomocí MailKit v ASP.NET Core Web API. K chybě dochází, protože společnost Microsoft zakázala základní ověřování, aby zvýšila zabezpečení, a donutila vývojáře přijmout OAuth2, bezpečnější metodu ověřování. V prvním řešení jsme použili MailKit s tokeny OAuth2 k ověření a odeslání e-mailu. Namísto spoléhání se na uživatelské jméno a heslo vyžaduje OAuth2 token, který je generován klientem Microsoft Identity Client (MSAL) a slouží k bezpečnému ověřování požadavků.
Pro začátek používá řešení k vytvoření klientské aplikace metodu `ConfidentialClientApplicationBuilder.Create()`, která je součástí knihovny MSAL. Tento krok inicializuje aplikaci základními přihlašovacími údaji, jako je ID klienta, ID tenanta a tajný klíč klienta, které jsou nutné k vygenerování tokenu OAuth2. Jakmile je aplikace vytvořena, metoda `AcquireTokenForClient()` načte token potřebný k ověření na serveru SMTP aplikace Outlook. Pomocí mechanismu `SaslMechanismOAuth2()` může MailKit ověřit proces odesílání e-mailů pomocí tohoto tokenu a zcela obejít základní ověřování. Tato metoda zajišťuje, že aplikace dodržuje moderní bezpečnostní protokoly a vyhýbá se zastaralým metodám.
Ve druhém řešení se rozhraní Microsoft Graph API používá k odesílání e-mailů bez přímé interakce se serverem SMTP. Microsoft Graph poskytuje komplexní řešení pro správu služeb společnosti Microsoft, včetně e-mailů aplikace Outlook. Rozhraní Graph API využívá ověřování OAuth2 prostřednictvím `DelegateAuthenticationProvider()`, který každému požadavku přiřadí token OAuth2. Tento token se generuje podobně pomocí MSAL. Objekt `GraphServiceClient` usnadňuje bezpečnou komunikaci se servery společnosti Microsoft a umožňuje rozhraní API bezproblémově odesílat e-maily. Tato metoda je užitečná zejména pro ty, kteří chtějí obsluhovat širší sadu služeb Microsoft s menším počtem přímých připojení k jednotlivým službám, jako je SMTP.
Nakonec jsme ve třetím řešení prozkoumali tradičnější přístup pomocí vestavěného System.Net.Mail jmenný prostor .NET. I když stále používá k ověřování OAuth2, tato metoda nahrazuje MailKit SMTP klientem System.Net.Mail pro odesílání e-mailů. Token OAuth2 je předán jako pověření namísto obvyklé kombinace uživatelského jména a hesla. E-mail je vytvořen a odeslán pomocí typických objektů `MailMessage` a `SmtpClient`. Tento přístup může být užitečný pro vývojáře, kteří dávají přednost práci s nativními knihovnami .NET, ale přesto vyžadují bezpečné ověřování OAuth2 pro odesílání e-mailů.
Všechny tyto metody nejen řeší problém se zakázáním základního ověřování, ale také zajišťují budoucí funkčnost odesílání e-mailů ve vašem ASP.NET Core Web API. Každé řešení zdůrazňuje důležitost zabezpečení prostřednictvím protokolu OAuth2, který nahrazuje zastaralé a méně bezpečné metody ověřování. Využitím moderních ověřovacích knihoven, jako jsou MSAL a Microsoft Graph, mohou vývojáři zajistit, aby jejich aplikace zůstaly v souladu s nejnovějšími bezpečnostními standardy, a přitom stále nabízely spolehlivé možnosti odesílání e-mailů.
Řešení 1: Přepnutí na OAuth2 pro ověřování aplikace Outlook
Tento přístup využívá ASP.NET Core a MailKit a nahrazuje základní ověřování protokolem OAuth2, což je doporučená metoda pro zabezpečené odesílání e-mailů v aplikaci 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);
}
Řešení 2: Použití Microsoft Graph API k odesílání e-mailů
Tato metoda zahrnuje použití rozhraní Microsoft Graph API pro odesílání e-mailů z backendu ASP.NET Core, přičemž se zcela obchází konfigurace SMTP.
// 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();
Řešení 3: Použití OAuth2 s SMTP (jiná knihovna)
Tento přístup používá System.Net.Mail pro odesílání e-mailů s OAuth2, namísto MailKit, se stejnou metodou ověřování OAuth.
// 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);
Implementace moderních bezpečnostních standardů pro odesílání e-mailů
V kontextu moderních e-mailových systémů je základní autentizace stále více považována za zastaralou a nezabezpečenou. To platí zejména pro velké poskytovatele služeb, jako je Outlook, kteří zakázali základní ověřování, aby vynutili bezpečnější mechanismy, jako je OAuth2. Základní ověřování, které se spoléhá pouze na uživatelské jméno a heslo, je zranitelné vůči útokům hrubou silou a může být ohroženo v případě odcizení přihlašovacích údajů. Přechod na OAuth2, jak Microsoft doporučuje, proto zajišťuje bezpečnou výměnu tokenů bez odhalení přihlašovacích údajů uživatele.
Jedním z klíčových aspektů implementace OAuth2 je koncept přístupových tokenů. Namísto spoléhání se na přímé ověřování prostřednictvím serverů SMTP vydává OAuth2 časově vázané tokeny, které umožňují bezpečný přístup ke zdrojům, jako jsou e-mailové služby. Tyto tokeny uděluje autorizační server a vývojáři je mohou získat pomocí knihoven, jako je Microsoft Identity Client (MSAL). S těmito tokeny získávají aplikace omezený přístup k uživatelskému účtu, což snižuje rizika spojená s prodlouženými statickými přihlašovacími údaji.
Kromě toho přijetí OAuth2 nejen sladí vaši aplikaci s moderními bezpečnostními postupy, ale také ji připraví na budoucí vývoj. Mnoho rozhraní API, včetně těch pro cloudové služby, nyní pro zabezpečenou komunikaci silně spoléhá na protokol OAuth2. To zajišťuje, že funkce odesílání e-mailů zůstane funkční a bezpečná, jak se služby vyvíjejí. Pro integrující vývojáře MailKit s ASP.NET Core, využívající OAuth2 přináší řadu vylepšení zabezpečení, od autentizace na základě tokenů až po šifrované přenosy prostřednictvím protokolů jako STARTTLS.
Často kladené otázky o ověřování Outlook v ASP.NET Core
- Co způsobuje chybu 535: 5.7.139 v aplikaci Outlook?
- K této chybě dochází, protože je zakázáno základní ověřování pro server SMTP aplikace Outlook. Microsoft nyní vyžaduje OAuth2 pro bezpečné ověřování.
- Jak mohu povolit OAuth2 v MailKit?
- OAuth2 můžete implementovat pomocí ConfidentialClientApplicationBuilder.Create() pro konfiguraci vaší aplikace a SaslMechanismOAuth2() k ověření odesílání e-mailů pomocí tokenů.
- Jaká je alternativa k základnímu ověřování pro odesílání e-mailů v aplikaci Outlook?
- Upřednostňovanou alternativou je protokol OAuth2. K bezpečnému a časově omezenému ověřování používá místo uživatelských jmen a hesel tokeny.
- Je rozhraní Microsoft Graph API lepší než použití SMTP pro odesílání e-mailů?
- Microsoft Graph API je širší služba, která zvládne více než jen odesílání e-mailů. Je univerzálnější a doporučuje se, pokud potřebujete přístup k různým zdrojům Microsoft 365.
- Jak otestuji, zda OAuth2 v mé aplikaci funguje správně?
- Můžete implementovat testy jednotek, abyste ověřili, že vaše tokeny OAuth2 jsou generovány a správně předávány službě pro odesílání e-mailů.
Závěrečné myšlenky na ověřování Outlooku s ASP.NET Core
Řešení základní chyby ověřování v aplikaci Outlook vyžaduje přijetí moderních bezpečnostních standardů, jako je OAuth2. Tento přístup eliminuje zranitelnosti základního ověřování a poskytuje bezpečnější metodu pro odesílání zpráv prostřednictvím serveru SMTP aplikace Outlook.
Díky integraci OAuth2 s ASP.NET Core a MailKit mohou vývojáři své aplikace připravit na budoucnost, zajistit bezpečnou komunikaci a shodu s aktualizovanými požadavky poskytovatelů služeb. To nejen řeší problém s ověřováním, ale také zvyšuje celkovou bezpečnost a funkčnost.
Zdroje a odkazy pro problémy s ověřováním aplikace Outlook
- Podrobná dokumentace o ukončení podpory základního ověřování a implementace OAuth2 společností Microsoft: Ukončení podpory základního ověřování Microsoft Exchange Online
- Komplexní průvodce používáním MailKit a MimeKit v .NET pro e-mailové funkce: Dokumentace MailKit
- Dokumentace knihovny MSAL (Microsoft Identity Client) pro ověřování OAuth2: Přehled platformy Microsoft Identity Platform (MSAL).