مدیریت کاربران از طریق IP آنها (net core 6 & webapi)

به نام خدا و سلاماین اولین مقاله (و شاید هم آخرین مقاله) من هستش و دنبال این هستم که یه کم چیزی که بلدم رو اینجا منتشر کنم. امیدوارم خوشتون بیاد و ازش استفاده کنید. به جای حرف های گنده گنده و گیج کننده تصمیم گرفتم از وسط یه داستان بامزه شروع کنم تا ببینیم به کجای داستان برسیم.هدف از این مقاله ارائه یک راه حل ساده ( و شاید ساده ترین راه حل) برای کنترل IP کاربرانی هست که به WebApi شما درخواست می دهند.فریم وورکی که ازش استفاده می کنم .net core 6 و ابزار من Visual Studio 2022 هستش. این رو زود گفتم که اگه دات نت کار نیستید بی خیال ادامه مقاله بشید. لازمه یه کم دات نت، یه کم c# ، مفاهیم DI، مفاهیم webapi و البته asp.net core Middleware رو بدونید. (اگه نمیدونید یه کم بخونید و به قولی توی سرو کله خودتون و پروژه بزنید یاد میگیرید)ویژوال استودیو رو باز کنید و Create a new project رو بزنید. پروژه از نوع ASP.Net core WebApi رو انتخاب کنید. یه نام با مسمی بهش بدید و تنظیمات فریم وورک رو ببرید روی .net core 6 مثل تصور زیر:تا اینجا که هیچ کار خاصی نکردیم ( و البته بعدا دیگه در مورد این مرحله ها چیزی نمی گم) فقط گفتم این ها رو که بعدا با تغییرش برای مقاصد دیگه در پروژه های دگیه بشه اشاره کرد.خب حالا ساختار پروژه اومده بالا با یه کنترلر پیش فرض در مورد آب و هوا (یا هر چی) و اون OpenAPI هم که داره داداش خودمون swagger هستش برای بازی با سرویس ها. ساختار پروژمون میشه شکل زیر:خب تا حالا همه کارها رو ویژوال استودیو کرد. کار ما تازه از اینجا شروع میشه.خب سوال اصلی پروژه ( و شاید سوال کلیدی زندگی هر شخصی): هدف ما از این کار چیست؟پاسخ: ما لیستی از IP های مجاز (white list) و غیر مجاز (black list) داریم و میتونیم چک کردن اونها رو فعال یا غیرفعال کنیم. با استفاده از این دو لیست ما تمام درخواست ها به web api رو چک میکنیم و اونهایی که با سیاست ما نخونه رد می کنیم که بره توی دیوار به قولی.مرحله یک: قرار دادن تنظیمات مورد نظر در پروژهمن دو تا لیست دارم و دوتا فلگ که باید true و یا false باشن. توی این پروژه میخوام بذارمشون توی appsettings.json . در نتیجه فایل appsettings.json پروژه من میشه این شکلی: https://gist.github.com/tarafdarmansour/c89d2e728cb58e98ef583f4d48a735be#file-appsettings-json شما میتونید این تنظیمات رو کم و زیاد کنید و هر چی دوست دارید بهشون اضافه کنید. همونطور که فهمیدید IP ها رو با ، از هم جدا کردم و به صورت یه رشته گذاشتم.مرحله دو: خوندن تنظیمات از appsettings.json و استفاده در یک سرویسحالا وقتشه این تنظیمات رو بخونم و توی یه سرویس ازشون استفاده کنم. من یه سرویس و اینترفیسش رو اضافه میکنم تا بتونم بعدا توی مسیر حرکت HTTP Request توی Middleware ازش استفاده کنم. https://gist.github.com/tarafdarmansour/80e0ecdc8e8bef45af0da3f9649e13b2#file-ipcheckservice-cs خب توی سازنده این سرویس من مقادیر فلگ ها رو از فایل کانفیگ میخونم و با توجه به اونها لیست IP ها رو پر میکنم تا بتونیم توی متد IsBlocked از این فلگ ها و لیست ها استفاده کنم. از اونجایی که فکر میکنم یه مقداری در مورد DI چیزی میدونید حرفی در مورد IConfiguration و یا IIPCheckService نمی زنم. بعد از تعریف این سرویس برای اینکه بتونید به وسیله تزریق وابستگی از این سرویس استفاده کنید کد زیر رو باید به Program.cs پروژه اضافه کنید.builder.Services.AddTransient<IIPCheckService, IPCheckService>();مرحله سه: استفاده از سرویس در یک Middlewareسرویس که آماده شد کافیه یه Middleware تعریف کنیم و از سرویس توی اون استفاده کنیم. کد Middleware من این شکلی شد. https://gist.github.com/tarafdarmansour/fafc565a9383e063d4a958c85bbc979a#file-ipcheckmiddleware-cs اینکه MIddleware ها چی هستن و چه ساختاری دارن و چجوری فراخونی میشن و با چه ترتیبی رو از اینجا بخونید. من زیاد نمی خوام سرتون رو درد بیارم.حالا برای اینکه MIddleware ما برای همه درخواست ها اجرا بشه باید کد زیر رو به Program.cs اضافه کنید.app.UseMiddleware<IpCheckMiddleware>();اگه خواستید فقط برای بعضی متد ها اجرا بشه هم یه روش هایی وجود داره هم میتونید از FilterAttribute ها استفاده کنید.در آخر یه نکته رو باید بهش توجه کنیم که برای داشتن IP صحیح کاربر و مطمئن بودن از اون باید تکه کد زیر رو توی Program.cs قرار بدید.خب حالا تقریبا همه کارها رو انجام دادیم.میتونید برای تست روی سیستم خودتون اجراش کنید و مقدار BlackListCheck رو true قرار بدید. لازمه IP سیستمون رو که معمولا 1:: هست توی BlackList قرار بدید. در اولین اجرا این صفحه رو میبینید:حالا اگه IP تون رو از اون لیست خارج کنید باید صفحه swagger رو ببینید. برای تست بهتر باید برنامه رو روی یه سرور بذارید و بعضی IP ها رو ببندید و بعضی ها رو باز بذارید تا تست قشنگ تری داشته باشید.یه نکته بگم که بدون سرور هم میشه با ابزاری مثل ngrok اما چون تحریم هستیم بهش دسترسی نداریم. اگه خارج از ایران هستید میتونید برنامتون رو اجرا کنید و به وسیله ngrok از اینترنت بهش دسترسی داشته باشید.سورس این پروژه رو روی گیت هاب اینجا گذاشتم.خوشحال میشم هر نظری در مورد مقاله داشتید بهم بگید. به امید خدا توی نسخه های بعدی این برنامه سراغ روش های دیگه انجام این کار میریم.فعلا.