نحوه پیادهسازی Signed URLs برای فایلهای خصوصی در CDN را با استفاده از .NET
مفهوم Signed URL چیست و چرا به آن نیاز داریم؟
به طور پیشفرض، فایلها در یک CDN یا Storage یا به صورت Public (دسترسی برای همه) هستند یا Private (بدون دسترسی مستقیم). Signed URL راهکاری است که اجازه میدهد یک فایل خصوصی را برای مدتی محدود و تحت شرایط خاص (مثلاً فقط برای یک IP خاص) در اختیار یک کاربر مجاز قرار دهید.
اجزای اصلی یک Signed URL معمولاً شامل موارد زیر است:
-
URL اصلی: مسیر فایل در CDN.
-
تاریخ انقضا (Expiration): زمانی که لینک از کار میافتد.
-
امضای دیجیتال (Signature): یک کد هششده که توسط کلید خصوصی سرور شما ایجاد شده تا اصالت درخواست تایید شود.
جریان کاری (Workflow) پیادهسازی
فرآیند کلی به شرح زیر است:
-
درخواست کاربر: کاربر برای مشاهده یک فایل (مثلاً یک ویدیو) به اپلیکیشن .NET شما درخواست میفرستد.
-
احراز هویت: اپلیکیشن شما بررسی میکند که آیا کاربر اجازه دسترسی به این فایل را دارد یا خیر.
-
تولید لینک: اپلیکیشن با استفاده از یک Private Key، یک لینک امضاشده تولید میکند.
-
ارسال به کاربر: لینک تولید شده به کلاینت (فرانتاِند) بازگردانده میشود.
-
درخواست از CDN: کلاینت از آن لینک برای دریافت فایل از CDN استفاده میکند.
-
تایید توسط CDN: لبههای CDN (Edge Locations) امضا را با Public Key بررسی کرده و در صورت صحت، فایل را تحویل میدهند.
پیادهسازی با AWS CloudFront در .NET
یکی از رایجترین سناریوها استفاده از Amazon CloudFront است. برای این کار مراحل زیر را دنبال کنید:
گام اول: آمادهسازی کلیدها
ابتدا باید یک جفت کلید (Key Pair) در کنسول AWS ایجاد کنید. کلید عمومی را در CloudFront آپلود کرده و کلید خصوصی (.pem) را در اپلیکیشن .NET خود نگه دارید.
گام دوم: نصب پکیجهای لازم
در پروژه .NET خود، پکیج NuGet زیر را نصب کنید:
dotnet add package AWSSDK.CloudFront
گام سوم: کدنویسی برای تولید Signed URL
در اینجا یک متد نمونه برای تولید لینک امضاشده آورده شده است:
using Amazon.CloudFront;
public class CloudFrontSigner
{
private readonly string _publicKeyId = "KXXXXXXXXXXXX"; // از پنل AWS
private readonly string _privateKeyPath = "path/to/private_key.pem";
public string GenerateSecureUrl(string resourceUrl, int durationInMinutes)
{
using (var reader = System.IO.File.OpenText(_privateKeyPath))
{
// زمان انقضا
DateTime expiryTime = DateTime.UtcNow.AddMinutes(durationInMinutes);
// تولید لینک امضا شده
string signedUrl = AmazonCloudFrontUrlSigner.GetCustomSignedUrl(
AmazonCloudFrontUrlSigner.Protocol.Https,
"distribution-id.cloudfront.net", // دامنه CDN شما
reader,
resourceUrl,
_publicKeyId,
expiryTime,
null // در صورت نیاز به محدودیت IP
);
return signedUrl;
}
}
}
پیادهسازی با Azure CDN
در Azure، مفهوم مشابهی به نام Shared Access Signature (SAS) وجود دارد. اگر از Azure Front Door یا Azure CDN استفاده میکنید، میتوانید توکنهای امنیتی تولید کنید.
برای تولید توکن در .NET برای Azure Storage (که پشت CDN قرار دارد):
using Azure.Storage.Blobs;
using Azure.Storage.Sas;
public string GetAzureSasUrl(string blobName)
{
var blobClient = new BlobClient(connectionString, containerName, blobName);
BlobSasBuilder sasBuilder = new BlobSasBuilder()
{
BlobContainerName = containerName,
BlobName = blobName,
Resource = "b",
ExpiresOn = DateTimeOffset.UtcNow.AddHours(1)
};
sasBuilder.SetPermissions(BlobSasPermissions.Read);
return blobClient.GenerateSasUri(sasBuilder).ToString();
}
نکات امنیتی و بهترین شیوهها (Best Practices)
در هنگام کار با فایلهای خصوصی، رعایت این موارد الزامی است:
الف) زمان انقضای کوتاه
هرچه زمان انقضا ($T_{expiry}$) کوتاهتر باشد، ریسک لو رفتن لینک کمتر است. برای استریم ویدیو، لینکی با انقضای ۵ دقیقه کافی است، زیرا فقط برای "شروع" پخش نیاز به تایید است.
$$T_{expiry} = T_{now} + \Delta t$$
که در آن $\Delta t$ باید بر اساس نوع محتوا بهینه شود.
ب) استفاده از Custom Policies
در CloudFront، شما میتوانید "سیاستهای سفارشی" (Custom Policies) تعریف کنید. مثلاً محدود کردن دسترسی فقط به یک IP Address خاص:
نکته: اگر کاربران شما از اینترنت موبایل استفاده میکنند، محدودیت IP ممکن است باعث خطا شود چون IP آنها مدام تغییر میکند.
ج) نگهداری امن کلید خصوصی
هرگز کلید خصوصی (.pem یا Secret Key) را در سورسکد (Git) قرار ندهید. از سرویسهایی مثل Azure Key Vault یا AWS Secrets Manager استفاده کنید.
مقایسه روشهای مختلف
| ویژگی | CloudFront Signed URL | Azure SAS | Cloudflare Workers |
| پیچیدگی پیادهسازی | متوسط | ساده | بالا (نیاز به کدنویسی در Edge) |
| امنیت | بسیار بالا | بالا | بسیار بالا |
| سازگاری با .NET | عالی (SDK رسمی) | عالی (SDK رسمی) | نیاز به HttpClient و هندل کردن دستی |
عیبیابی (Troubleshooting)
اگر لینکهای تولید شده کار نمیکنند، موارد زیر را چک کنید:
-
هماهنگی ساعت سرور: مطمئن شوید ساعت سرور شما با UTC تنظیم شده است. اختلاف ساعت باعث انقضای زودهنگام لینک میشود.1
-
فرمت کلید: کلیدهای خصوصی باید با فرمت RSA استاندارد باشند.2
-
دسترسیهای Origin: مطمئن شوید که CDN اجازه دسترسی به Storage اصلی (مانند S3 یا Blob) را دارد، اما کاربران عادی ندارند.3
نتیجه گیری
پیادهسازی Signed URLs تعادلی عالی بین کارایی (Performance) به واسطه استفاده از CDN و امنیت (Security) به واسطه کنترل دسترسی در لایه اپلیکیشن ایجاد میکند. با استفاده از کتابخانههای قدرتمند در .NET، این فرآیند بسیار استاندارد و قابل اعتماد انجام میشود.
0 نظر
هنوز نظری برای این مقاله ثبت نشده است.