امیر معصوم بیگی
امیر معصوم بیگی
خواندن ۴ دقیقه·۲ سال پیش

ارسال فایل در 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 بعد از چک کردن هایی که نیاز دارید .

*امیدوارم که این مقاله برای شما مفید بوده باشه ، در صورتی که ایرادی دیدید بگید اصلاح کنم .

احراز هویتasp net core
شاید از این پست‌ها خوشتان بیاید