ارسال فایل در asp.net core بعد از احراز هویت یا موارد مشابه

سلام دوستان من امیر معصوم بیگی هستم تو این مقاله میخوام در مورد اینکه چطور میتونیم یک فایل رو asp.net core بعد از احراز هویت ارسال کنیم صحبت کنم . اگه شما هم تا الان تلاش کرده باشید که به فایل های wwwroot دسترسی پیدا کنین ، میبینین که این کار به راحتی با وارد کردن آدرس url در بالای صفحه اتفاق میفته ، مثلا شما آدرس زیر رو مینویسینhttps://localhost:7008/ANIMAL.JPGبعد میبینین که به راحتی به این آدرس دسترسی دارین و فایل رو دریافت میکنین ، واسه یه سری سناریو ها اینکار چیز خوبیه ، ولی اگر یک وقت شما خواستید در صورتی که مثلا کاربرتون لاگین کرده بود فایل رو ارسال کنین ، اون وقت باید چیکار کنین ؟ اول از همه لینک گیت هاب این پروژه به آدرس زیر که اگه این مقاله واستون مفید بود میتونید بهش ستاره هم بدید ? : https://github.com/AmBplus/GetStaticFileAfterAuthorizationPolicy نکته اول اینکه که هر فایلی که تو مسیر wwwroot میزارید در صورتی که در middleware استاتیک فایل هارو ادد کرده باشید اگر آدرس فایل رو وارد کنید اون رو به شما نشون میده ، میدل ور زیر :app.UseStaticFiles();اما خیلی وقتا ما نیاز داریم که به استاتیک فایل ها در wwwroot دسترسی داشته باشیم ، پس نمیتونیم در اکثر مواقع این میدلور رو حذف کنیم ، و این میدلور قبل از میدل ور های زیر که مربوط به احراز هویت هستن قرار میگیره :app.UseAuthentication();app.UseAuthorization();راه حل اینکار که سایت ماکروسافت هم ارائه داده ، اینه که ما یک پوشه دیگه در برنامه بسازیم ، بجز wwwroot و اینجور فایل هارو در اون مسیر قرار بدیم ، مثل عکس زیر که ما پوشه MyStaticFiles رو ایجاد کردیم و داخل اون یک پوشه به اسم images و درونش یک عکس گل قرار دادیم که قراره این عکس رو بعد از اینکه لاگین کردیم ببینیم ، اگه وارد لینک گیت هاب بشید میتونید سورس رو به طور کامل ببنید .حالا نیازه یه سری تنظیمات در فایل program.cs ایجاد کنیم ، برای منظور بعد از میدل ور های احراز هویت و قبل از میدل ور هایی که کنترلر یا صفحات ریزور رو شناسایی میکنه ما کد زیر رو قرار میدیمapp.UseStaticFiles(new StaticFileOptions{ FileProvider = new PhysicalFileProvider( Path.Combine(builder.Environment.ContentRootPath, &quotMyStaticFiles&quot)), RequestPath = &quot/StaticFiles&quot});کد بالا یک میدلور هست که پوشه mystaticfiles که ما ساختیم رو به برنامه معرفی میکنه ، و ما حالا از داخل برنامه میتونیم به اون دسترسی داشته باشیم ، تفاوتی که با پوشه wwwroot در حالت عادی داره اینه که اگر آدرس فایل های داخل این پوشه رو از url وارد کنیم ما چیزی رو نمیتونیم دریافت کنیم که هدف اصلی ما هم همینه .کل کد در قسمت program.cs به صورت زیره ، از اونجایی که واسه تست این برنامه ما میخواستیم احراز هویت رو هم انجام بدیم یه سری کد اضاف برای این منظور هم قرار گرفته https://gist.github.com/AmBplus/09c3a34ab29619f3779c7dec33f8ebc8 برای اینکه ببینیم کاری که کردیم چطور میشه ازش استفاده کرد به صفحه GetFileWithAuth میریم که در آدرس زیر قرار دارهhttps://localhost:7008/GetFileWithAuth اگر بدون اینکه لاگین کرده باشید وارد این صفحه بشید ، شما به صفحه لاگین هدایت میشید و هیچیزی به شما نمایش داده نمیشه ، ولی اگر لاگین کرده باشید ، میتونید به این صفحه دسترسی داشته باشید و در متد Get این صفحه عکس یک گل که در آدرس زیر قرار داره برای شما ارسال میشهMyStaticFiles/Images/flower.jpgاگر این آدرس رو به صورت زیر وارد کنین هیچ چیزی به شما نمایش داده نمیشهhttps://localhost:7008/MyStaticFiles/Images/flower.jpg یاhttps://localhost:7008/Images/flower.jpgکه این بر خلاف حالت قبل که در wwwroot فایل قرار میدادیم هست ، در حالت قبل اگر مسیر بعد از wwwroot رو مینوشتیم فایل برای ما ارسال میشد ، در حالت این اتفاق نمیفته ، و الان اگر بخوایم به فایل دسترسی داشته باشیم میتونیم به صورت زیر عمل کنیم ، در اینجا به طور مثال یک صفحه ایجاد کردیم و در اون صفحه بعد از احراز هویت فایل رو به کاربر نشون میدیمسورس این صفحه به صورت زیره که در لینک گیت هاب پروژه که بالا فرستادم هم میتونید در پوشه pages اون رو مشاهده کنید . https://gist.github.com/AmBplus/e2376ba0c443964aee28ed8d80820e1c همونجوری که میبنید ما اتربیتوت [Authorize] رو در بالای صفحه گزاشتیم ، اگر با ریزور پیج آشنایی داشته باشید میدونید که ما نمیتونیم این اتریبوت رو بالای هندرلر ها بزاریم ، اگر در کنترلر میخواید استفاده کنید میتونید این اتربیوت رو بالای اکشن بزارید ، اما در قسمت OnGet همونجوری که میبینید ما یک نتیجه یک فایل فیزیکی یا همون PhysicalFileResult رو برمیگردونیم ، که بعد از به دست آوردن مسیر ریشه پروژه و ساختن مسیر فایل ما اون رو به صورت یک PhysicalFile به راحتی برمیگردونیم ، که البته این فایل بعد از احراز هویت به کاربر برگردونده شده و ارسال فایل کاملا در اختیار ما قرار داره به طور خلاصه برای اینکه بخواید یک فایل رو فقط سرور خودتون برگردونه کار های زیر رو میکنید1. ایجاد یک پوشه در مسیر ریشه پروژه2. شناساندن مسیر ایجاد پوشه بعد از میدل ور های احراز هویت و بررسی دسترسی3. ارسال فایل از درون برنامه به صورت دستی و نه به صورت url بعد از چک کردن هایی که نیاز دارید . *امیدوارم که این مقاله برای شما مفید بوده باشه ، در صورتی که ایرادی دیدید بگید اصلاح کنم .