Skip to Content
Documentationبيئات تشغيل الخادم الخلفيASP.NET Core (C#)

C# (ASP.NET Core)

بالنسبة لبيئات Microsoft المؤسسية، يضمن دمج ProxyTracer مباشرة في مسار طلبات ASP.NET Core HTTP رفض حركة المرور الخبيثة قبل أن تفعّل التوجيه أو ربط النماذج أو استعلامات قاعدة البيانات.

البرمجية الوسيطة

يستخدم هذا التطبيق System.Text.Json لإلغاء التسلسل بسرعة فائقة، ويفرض مهلة صارمة عبر HttpClient، ويختصر المسار باستجابة 403 Forbidden إذا تم تمييز الاتصال كبروكسي.

using System; using System.Net.Http; using System.Net.Http.Headers; using System.Text.Json; using System.Text.Json.Serialization; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace ProxyTracer.Security { public class ProxyTracerMiddleware { private readonly RequestDelegate _next; private readonly HttpClient _httpClient; private readonly ILogger<ProxyTracerMiddleware> _logger; private readonly string _apiKey; public ProxyTracerMiddleware(RequestDelegate next, IConfiguration config, ILogger<ProxyTracerMiddleware> logger) { _next = next; _logger = logger; _apiKey = config["PROXYTRACER_API_KEY"] ?? throw new ArgumentNullException("PROXYTRACER_API_KEY is missing"); // عميل قابل لإعادة الاستخدام بمهلة صارمة 500 مللي ثانية _httpClient = new HttpClient { Timeout = TimeSpan.FromMilliseconds(500) }; } public async Task InvokeAsync(HttpContext context) { // 1. استخراج عنوان IP (يتطلب تهيئة app.UseForwardedHeaders() في Program.cs) var ip = context.Connection.RemoteIpAddress?.ToString(); // تخطي عناوين IP للتطوير المحلي if (!string.IsNullOrEmpty(ip) && ip != "127.0.0.1" && ip != "::1") { try { // 2. الاستعلام من ProxyTracer API بشكل غير متزامن using var request = new HttpRequestMessage(HttpMethod.Get, $"https://api.proxytracer.com/v1/check/{ip}"); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _apiKey); using var response = await _httpClient.SendAsync(request); if (response.IsSuccessStatusCode) { using var jsonStream = await response.Content.ReadAsStreamAsync(); var ptResponse = await JsonSerializer.DeserializeAsync<ProxyTracerResult>(jsonStream); // 3. قطع الاتصال إذا تم اكتشاف بروكسي/VPN if (ptResponse != null && ptResponse.Proxy) { context.Response.StatusCode = StatusCodes.Status403Forbidden; context.Response.ContentType = "application/json"; await context.Response.WriteAsync("{\"error\": \"Access Denied: VPN or Proxy detected.\"}"); return; // اختصار مسار معالجة الطلب } } } catch (Exception ex) { // Fail open: تسجيل الخطأ والسماح بتمرير الطلب _logger.LogWarning($"ProxyTracer validation failed: {ex.Message}"); } } // 4. حركة المرور نظيفة، المتابعة إلى المتحكمات await _next(context); } // بنية خفيفة الوزن تطابق استجابة {"proxy": true|false} بدقة private class ProxyTracerResult { [JsonPropertyName("proxy")] public bool Proxy { get; set; } } } }

التكوين:

لتفعيل الحماية، سجل البرمجية الوسيطة في ملف Program.cs. تأكد من وضعها بعد UseForwardedHeaders ولكن قبل UseRouting و UseAuthentication.

var app = builder.Build(); // 1. التأكد من استخراج عناوين IP الحقيقية إذا كنت خلف موازن حمل NGINX/Cloudflare app.UseForwardedHeaders(); // 2. إسقاط حركة المرور الخبيثة مبكراً app.UseMiddleware<ProxyTracer.Security.ProxyTracerMiddleware>(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
آخر تحديث في