التفويض والمصادقة في C# (.NET): من الأساسيات إلى الحلول الصناعية
أمان تطبيقات الويب هو جانب بالغ الأهمية في التطوير، وفي نظام C# (.NET) توجد مجموعة أدوات قوية لتنفيذ المصادقة (التحقق من هوية المستخدم) والتفويض (التحقق من صلاحيات الوصول). في هذه المقالة، سنستعرض الأساليب الرئيسية: من ASP.NET Core Identity المدمج إلى الحلول المرنة القائمة على JWT وOAuth 2.0.
1. ASP.NET Core Identity — نظام إدارة مستخدمين مدمج
ASP.NET Core Identity هو إطار عمل متكامل للتسجيل، تسجيل الدخول، إدارة الأدوار وكلمات المرور. يوفر نماذج جاهزة (User، Role)، مخزن بيانات (افتراضياً Entity Framework + SQL Server) و middleware.
// التسجيل في Program.csbuilder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddDefaultIdentity<IdentityUser>(options =>{ options.SignIn.RequireConfirmedAccount = true; options.Password.RequiredLength = 8;}).AddRoles<IdentityRole>().AddEntityFrameworkStores<AppDbContext>();
// Middlewareapp.UseAuthentication();app.UseAuthorization();مثال على وحدة تحكم محمية:
[Authorize(Roles = "Admin")]public class AdminController : Controller{ public IActionResult Index() => View();}
// الحصول على المستخدم الحاليvar user = await _userManager.GetUserAsync(User);var roles = await _userManager.GetRolesAsync(user);2. JWT (JSON Web Token) — مصادقة سلسة لواجهات API وتطبيقات SPA
JWT هو رمز مضغوط وآمن لعناوين URL يحتوي على claims (ادعاءات) حول المستخدم. مثالي لواجهات REST API، تطبيقات الجوال وتطبيقات الصفحة الواحدة (React، Angular، Vue).
تثبيت الحزمة:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearerالإعداد في Program.cs:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = "https://pythonlib.ru", ValidateAudience = true, ValidAudience = "https://api.pythonlib.ru", ValidateLifetime = true, IssuerSigningKey = new SymmetricSecurityKey( Encoding.UTF8.GetBytes("SuperSecretKey123!SuperSecretKey123!")), ClockSkew = TimeSpan.Zero }; });توليد الرمز (مثلاً في وحدة تحكم تسجيل الدخول):
var claims = new List<Claim>{ new Claim(ClaimTypes.Name, user.UserName), new Claim(ClaimTypes.Role, "User"), new Claim("custom_claim", "value")};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SuperSecretKey123!"));var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken( issuer: "https://pythonlib.ru", audience: "https://api.pythonlib.ru", claims: claims, expires: DateTime.Now.AddHours(2), signingCredentials: creds);
return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });حماية نقطة النهاية:
[Authorize][HttpGet("profile")]public IActionResult GetProfile(){ var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value; return Ok(new { Message = "تم منح الوصول", UserId = userId });}3. مصادقة Cookie — كلاسيكية لتطبيقات MVC
لتطبيقات الخادم التقليدية (Razor Pages، MVC) من المناسب استخدام مصادقة Cookie. يحصل المستخدم على cookie مشفر، يتم إرساله تلقائياً