التفويض والمصادقة في C# (.NET): دليل شامل
أمان تطبيقات الويب هو حجر الزاوية في التطوير الحديث. في بيئة C# (.NET)، تتيح آليات المصادقة والتفويض المدمجة حماية تطبيقك بمرونة وموثوقية. في هذه المقالة، سنستعرض المفاهيم الأساسية والأدوات وأمثلة الكود للعمل مع Identity وJWT ونموذج الأدوار.
1. المفاهيم الأساسية
قبل الانتقال إلى الكود، من المهم التمييز بين المصطلحين:
- المصادقة — عملية التحقق من هوية المستخدم (من أنت؟). تتم عادةً عبر اسم المستخدم/كلمة المرور، الرموز المميزة، أو موفري الخدمة الخارجيين.
- التفويض — عملية تحديد صلاحيات الوصول (ما الذي يمكنك فعله؟). يتم تنفيذها عبر الأدوار، السياسات، أو المطالبات (claims).
2. ASP.NET Core Identity — حل مدمج
Microsoft.AspNetCore.Identity هو نظام كامل لإدارة المستخدمين يتضمن التسجيل، تسجيل الدخول، إعادة تعيين كلمة المرور، المصادقة الثنائية، وغيرها الكثير. يعمل مع Entity Framework Core ويدعم أي مخازن بيانات.
التثبيت:
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCoredotnet add package Microsoft.EntityFrameworkCore.SqlServerمثال لتسجيل مستخدم (وحدة التحكم Account):
public class AccountController : Controller{ private readonly UserManager<IdentityUser> _userManager; private readonly SignInManager<IdentityUser> _signInManager;
public AccountController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager) { _userManager = userManager; _signInManager = signInManager; }
[HttpPost] public async Task<IActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new IdentityUser { UserName = model.Email, Email = model.Email }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home"); } foreach (var error in result.Errors) ModelState.AddModelError(string.Empty, error.Description); } return View(model); }}3. JWT (JSON Web Tokens) — مصادقة بدون حالة
لتطبيقات SPA الحديثة (React، Angular) أو تطبيقات الهاتف المحمول، غالبًا ما يُستخدم JWT. يتم توقيع الرمز المميز من قبل الخادم ويحتوي على مطالبات (claims) حول المستخدم. لا يخزن الخادم الجلسات، مما يبسط التوسع.
الإعداد في Program.cs:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidateAudience = true, ValidAudience = builder.Configuration["Jwt:Audience"], ValidateLifetime = true, IssuerSigningKey = new SymmetricSecurityKey( Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])) }; });توليد الرمز المميز:
public string GenerateToken(IdentityUser user){ var claims = new[] { new Claim(ClaimTypes.NameIdentifier, user.Id), new Claim(ClaimTypes.Email, user.Email), new Claim(ClaimTypes.Role, "User") };
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
va