افزایش امنیت برنامههای وب با احراز هویت چندمرحلهای (MFA) در ASP.NET Core
احراز هویت چندمرحلهای (MFA) چیست؟
MFA یک فرآیند امنیتی است که در آن کاربر برای دسترسی به یک حساب یا سیستم، ملزم به ارائه دو یا چند عامل تأیید هویت مختلف است. این عوامل به طور کلی به سه دسته تقسیم میشوند:
-
دانش (Something you know): چیزی که فقط کاربر میداند، مانند رمز عبور یا پینکد.
-
مالکیت (Something you have): چیزی که فقط کاربر در اختیار دارد، مانند تلفن همراه (برای دریافت کد یکبار مصرف) یا یک توکن سختافزاری.
-
ذاتی (Something you are): یک مشخصه بیومتریک منحصر به فرد کاربر، مانند اثر انگشت یا تشخیص چهره.
با ترکیب حداقل دو عامل از این دستهها، حتی اگر یک عامل (مانند رمز عبور) توسط مهاجم به سرقت برود، دسترسی به حساب کاربری بدون عامل دوم تقریبا غیرممکن خواهد بود.
گام اول: ایجاد و پیکربندی پروژه ASP.NET Core
برای شروع، ما به یک پروژه ASP.NET Core Web App (Model-View-Controller) نیاز داریم که از سیستم احراز هویت پیشفرض Identity استفاده کند.
-
ایجاد پروژه جدید: محیط توسعه ویژوال استودیو را باز کرده و یک پروژه جدید از نوع "ASP.NET Core Web App (Model-View-Controller)" ایجاد کنید.
-
انتخاب نوع احراز هویت: در مرحله بعدی، در بخش "Authentication type"، گزینه Individual Accounts را انتخاب کنید. این گزینه به صورت خودکار تمام زیرساختهای لازم برای ASP.NET Core Identity، از جمله مدلهای کاربری، پایگاه داده و صفحات مربوط به ثبتنام، ورود و مدیریت حساب را به پروژه اضافه میکند.
پس از ایجاد پروژه، ساختار اولیه شامل کنترلرها، مدلها و نماهای مربوط به حساب کاربری (Account) و مدیریت آن (Manage) در پوشه Areas/Identity قابل مشاهده خواهد بود.
-
اعمال Migration و ساخت پایگاه داده: ASP.NET Core Identity از Entity Framework Core برای مدیریت پایگاه داده استفاده میکند. برای ساخت جداول مورد نیاز، دستورات زیر را در پنجره "Package Manager Console" اجرا کنید:
Add-Migration InitialCreateIdentitySchema Update-Databaseاین دستورات، جداول استاندارد Identity مانند AspNetUsers، AspNetRoles و ... را در پایگاه داده شما ایجاد میکنند.
گام دوم: پیادهسازی MFA مبتنی بر اپلیکیشن Authenticator (TOTP)
یکی از متداولترین و امنترین روشهای پیادهسازی MFA، استفاده از الگوریتم رمز یکبار مصرف مبتنی بر زمان (Time-based One-time Password - TOTP) است. در این روش، کاربر از یک اپلیکیشن Authenticator مانند Google Authenticator یا Microsoft Authenticator بر روی تلفن همراه خود استفاده میکند.
خوشبختانه، قالب پیشفرض ASP.NET Core Identity به طور کامل از این قابلیت پشتیبانی میکند و فعالسازی آن بسیار ساده است.
فعالسازی MFA توسط کاربر
-
اجرای برنامه و ثبتنام: پروژه را اجرا کرده و یک حساب کاربری جدید ثبت کنید. پس از ثبتنام، وارد حساب کاربری خود شوید.
-
ورود به بخش مدیریت حساب: بر روی نام کاربری خود در بالای صفحه کلیک کرده و گزینه "Manage" را انتخاب کنید. در منوی سمت چپ، به بخش Two-factor authentication (2FA) بروید.
-
افزودن اپلیکیشن Authenticator: در این صفحه، بر روی دکمه "Add authenticator app" کلیک کنید. ASP.NET Core به صورت خودکار یک کلید مخفی (Shared Key) منحصر به فرد برای این کاربر تولید کرده و آن را به صورت یک کد QR نمایش میدهد.
-
اسکن کد QR: کاربر باید اپلیکیشن Authenticator خود را باز کرده و این کد QR را اسکن کند. اپلیکیشن با استفاده از کلید مخفی، شروع به تولید کدهای ۶ رقمی مبتنی بر زمان میکند که هر ۳۰ ثانیه تغییر میکنند.
-
تأیید نهایی: کاربر کد تولید شده در اپلیکیشن را در فیلد "Verification Code" وارد کرده و بر روی دکمه "Verify" کلیک میکند. در صورت صحت کد، MFA برای حساب کاربری او فعال میشود. سیستم همچنین مجموعهای از کدهای بازیابی (Recovery Codes) را نمایش میدهد که کاربر باید آنها را در مکانی امن ذخیره کند تا در صورت عدم دسترسی به تلفن همراه، بتواند وارد حساب خود شود.
فرآیند ورود با MFA
حالا اگر کاربر از حساب خود خارج شده و مجدداً تلاش کند وارد شود، فرآیند به شکل زیر خواهد بود:
-
کاربر نام کاربری و رمز عبور خود را وارد میکند.
-
سیستم به صورت خودکار تشخیص میدهد که MFA برای این کاربر فعال است و او را به صفحهای جدید هدایت میکند.
-
از کاربر خواسته میشود تا کد یکبار مصرف تولید شده توسط اپلیکیشن Authenticator را وارد کند.
-
پس از تأیید کد، کاربر با موفقیت وارد سیستم میشود.
این فرآیند به طور کامل توسط صفحات پیشفرض Identity مدیریت میشود و نیاز به کدنویسی پیچیدهای ندارد.
گام سوم: پیادهسازی MFA مبتنی بر ایمیل
در برخی سناریوها، ممکن است بخواهید از ایمیل به عنوان عامل دوم احراز هویت استفاده کنید. در این روش، یک کد یکبار مصرف به آدرس ایمیل ثبتشده کاربر ارسال میشود. برای پیادهسازی این قابلیت، باید یک سرویس ارسال ایمیل را به پروژه خود اضافه کنیم.
۱. تعریف رابط IEmailSender
ابتدا باید یک سرویس برای ارسال ایمیل تعریف کنیم. ASP.NET Core Identity دارای یک رابط به نام IEmailSender است که میتوانیم آن را پیادهسازی کنیم.
// Services/IEmailSender.cs
public interface IEmailSender
{
Task SendEmailAsync(string email, string subject, string htmlMessage);
}
۲. پیادهسازی سرویس ایمیل
در این مثال، ما از یک پیادهسازی ساده برای لاگ کردن ایمیل در کنسول استفاده میکنیم. در یک پروژه واقعی، شما باید از یک سرویسدهنده ایمیل معتبر مانند SendGrid, Mailgun یا SMTP سرور خودتان استفاده کنید.
// Services/EmailSender.cs
public class EmailSender : IEmailSender
{
public Task SendEmailAsync(string email, string subject, string message)
{
// در اینجا منطق اتصال به سرویس SMTP و ارسال ایمیل را پیادهسازی کنید.
// برای مثال، ما ایمیل را در کنسول چاپ میکنیم.
Console.WriteLine("---------------------");
Console.WriteLine($"To: {email}");
Console.WriteLine($"Subject: {subject}");
Console.WriteLine(message);
Console.WriteLine("---------------------");
return Task.CompletedTask;
}
}
۳. ثبت سرویس در Program.cs
سرویس ارسال ایمیل را باید در فایل Program.cs به عنوان یک سرویس Transient ثبت کنیم.
// Program.cs
// ... سایر سرویسها
builder.Services.AddTransient<IEmailSender, EmailSender>();
// ...
۴. تغییر فرآیند ورود
حالا باید منطق ورود را تغییر دهیم تا به جای اپلیکیشن Authenticator، از ایمیل استفاده کند. برای این کار باید صفحات مربوط به ورود را Scaffold کرده و آنها را ویرایش کنیم.
-
Scaffold کردن صفحات Identity: بر روی پروژه راست کلیک کرده، گزینه Add > New Scaffolded Item را انتخاب کنید. از لیست، Identity را انتخاب کرده و صفحات Account\Login و Account\LoginWith2fa را برای Override کردن انتخاب کنید.
-
اصلاح Login.cshtml.cs: در متد OnPostAsync فایل Login.cshtml.cs، پس از بررسی موفقیتآمیز بودن رمز عبور، اگر MFA فعال بود، باید کد را تولید و ایمیل کنیم.
// Areas/Identity/Pages/Account/Login.cshtml.cs // ... if (result.RequiresTwoFactor) { var user = await _signInManager.GetTwoFactorAuthenticationUserAsync(); if (user == null) { return NotFound($"Unable to load two-factor authentication user."); } var token = await _userManager.GenerateTwoFactorTokenAsync(user, "Email"); // تولید توکن برای Email Provider var subject = "Your Two-Factor Authentication Code"; var message = $"Your security code is: {token}"; await _emailSender.SendEmailAsync(user.Email, subject, message); return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe }); } // ... -
اصلاح
LoginWith2fa.cshtml.cs: در این صفحه، باید نوع Provider را به "Email" تغییر دهیم تاSignInManagerبداند که باید کد را با استفاده از Email Token Provider تأیید کند.// Areas/Identity/Pages/Account/LoginWith2fa.cshtml.cs // ... var result = await _signInManager.TwoFactorSignInAsync("Email", authenticatorCode, rememberMe, Input.RememberMachine); // ...
با این تغییرات، فرآیند MFA به جای استفاده از اپلیکیشن Authenticator، از طریق ارسال کد به ایمیل کاربر انجام خواهد شد.

ملاحظات و بهترین شیوهها (Best Practices)
-
کدهای بازیابی: همیشه به کاربران خود اهمیت ذخیرهسازی کدهای بازیابی را گوشزد کنید. این کدها تنها راه دسترسی به حساب در صورت مفقود شدن دستگاه عامل دوم هستند.
-
اجباری کردن MFA: برای کاربرانی که سطح دسترسی بالایی دارند (مانند ادمینها)، باید MFA را به صورت اجباری فعال کنید. میتوانید این کار را با استفاده از یک ActionFilter یا Authorization Policy سفارشی انجام دهید که بررسی کند آیا TwoFactorEnabled برای کاربر true است یا خیر.
-
پشتیبانی از روشهای متعدد: در صورت امکان، به کاربر اجازه دهید تا بین روشهای مختلف MFA (مانند اپلیکیشن، ایمیل یا پیامک) انتخاب کند.
-
امنیت کلید مخفی: کلید مخفی (Shared Key) که برای اپلیکیشن Authenticator تولید میشود، باید به صورت امن در پایگاه داده ذخیره شود. ASP.NET Core Identity این کار را به صورت خودکار انجام میدهد.
نتیجهگیری
پیادهسازی احراز هویت چندمرحلهای دیگر یک قابلیت لوکس نیست، بلکه یک ضرورت امنیتی برای حفاظت از دادههای کاربران است. خوشبختانه فریمورک ASP.NET Core به همراه Identity، ابزارهای قدرتمند و انعطافپذیری را برای افزودن این لایه امنیتی مهم به برنامههای وب فراهم میکند. با دنبال کردن مراحل ذکر شده در این مقاله، شما میتوانید به سادگی و با اطمینان، امنیت اپلیکیشن خود را به سطح بالاتری ارتقا دهید.
0 نظر
هنوز نظری برای این مقاله ثبت نشده است.