امنیت و صفت AllowAnonymous در ASP.Net MVC

چهارشنبه 20 آبان 1394

در این مقاله قصد داریم در مورد راه های امن در Authorize کردن توضیح دهیم ، و احراز هویت در asp.net mvc چگونه است و چطور انجام می شود و از نظر امنیتی چگونه است.

 امنیت و صفت AllowAnonymous در ASP.Net MVC

برای امنیت برنامه و مسیریابی پروژه خود شما نمی توانید از routing و web.config استفاده نمایید.

تنها راه امن Authorize کردن هر controller و استفاده کردن از صفت جدید AllowAnonymous

برای login کردن کاربر و ثبت نام کاربران.

این امنیت مبتنی بر فایل web.config هر گز نباید در یک برنامه mvc استفاده شود. به این دلیل که url های متعددی به Controller برخورد خواهد کرد و قرار دادن آن ها در web.config باعث پیدا نشدن آن ها خواهد شد.

یک تفاوت اساسی بین webform و webform mvc وجود دارد، در webform منابع شما در حال تلاش برای محافظت صفحات خود دارند.

ولی در webform mvc منابع شما در حال تلاش برای حفظ کردن Controller  و action ها هستند، اگر شما از آدرس صفحات را به جای حفاظت از controller ها استفاده کنید از نظر امنیتی برنامه ی شما آسیب پذیر خواهد شد.

در mvc به صورت پیش فرض تمام action ها و تمام controller ها قابل دسترسی تمام افراد است ، ولی ویژگی هایی ارائه شده است که شما می توانید سطح دسترسی به کاربران خود دهید.

در asp.net mvc3 یک فیلتر به نام AuthorizeAttribute  را به فایل global.asax اضافه می کنیم، که این کار در mvc3 بسیار دشوار بود برای اینکه کاربران login کنند و یا ثبت نام نمایند، در کد زیر نشان می دهیم که چگونه می توان AuthorizeAttribute را به صورت Globally به کد خود اضافه نماییم.

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new System.Web.Mvc.AuthorizeAttribute());
}

مشکل  authorize کردن به صورت ،globally باید شما حتما login و یا ثبت نام کنید، پیشنهاد می کنیم برای مجوز داشتن دسترسی از یک allowanonymous برای ثبت نام و ورود به سیستم استفاده نمایید.

دیگر از روش globally استفاده نکنید، و از روش authorize و کنترل هایی که در آن attribute استفاده شده است،استفاده نمایید.

در asp.net mvc4 شامل ویژگی  AllowAnonymous است ، که نیاز به نوشتن کد های بلند نیست و همین طور تنظیم کردن AuthorizeAttribute globally .در global.asax فقط نیاز به نوشتن یک متد با ویژگی های  .AllowAnonymous

روشی که انتخاب کردیم بهترین روش از نظر تامین امنیت را برای ما فراهم می کند، روشی که مفید نبود مثل ایجاد یک controller پایه با استفاده از صفت authorize و مشتق کردن هر یک از کنترل  ها به جز ثبت نام و login که در این کلاس پایه اند، مشکل این است که کنترل کننده های جدید به صورت خودکار محافظت نخواهند شد.

کد زیر متد login و ثبت نام است که attribute های آن هم قرار دارد.

 [AllowAnonymous]
 public ActionResult Login(string returnUrl)

 [HttpPost]
 [AllowAnonymous]
 [ValidateAntiForgeryToken]
 public ActionResult Login(LoginModel model, string returnUrl)

 [AllowAnonymous]
 public ActionResult Register()

 [HttpPost]
 [AllowAnonymous]
 [ValidateAntiForgeryToken]
 public ActionResult Register(RegisterModel model)

To add a global authorization filter to your Web ApiController,  add the following line to the  

Application_Start method in the global.asax file:

     GlobalConfiguration.Configuration.Filters.Add(new System.Web.Http.AuthorizeAttribute());

نکته: توجه داشته باشید که فیلتر mvc اجازه کنترل را با System.Web.Mvc  می دهد، در حالی که در Apicontroller برای authorize کردن کنترل از System.Web.Http  استفاده می کند.

در برنامه های کاربردی asp.net برای فرم ها از  authenticationاستفاده می کنند، استفاده از این احراز هویت ها برای انتقال بین web server ها و مرورگرها در یک cookie و یا یک رشته ی url  منتقل می شود.

احراز هویت تولید شده زمانی است که کاربر برای اولین بار در سایت login می کند، که اغلب شامل شناسه ی کاربر و مجموعه ای از نقش های کاربران است.

برای اینکه در برابر خطرهای دیگر،  برنامه ی شما امن باشد شما می توانید از RequireHttpsAttribute در  فایل Global.asax استفاده نمایید.

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new System.Web.Mvc.AuthorizeAttribute());
    filters.Add(new RequireHttpsAttribute());
}

در بسیاری از سایت ها ورود از طریق ssl است و تغییر مسیر برگشت بعد از وارد شدن شما به سایت از طریق http است.

کوکی نام کاربری و کلمه ی عبور را به صورت مخفی می آورد و شما آن را به صورت یک کلاس خالی ارسال می نمایید.علاوه بر آن شما آماده اید که زمان انجام handshake را بگیرید و کانال را ایمن سازی نمایید(بخش عمده ای ازدلایلی که باعث می شود https کند تر از http باشد) ،بنابر این هدایت به http بعد از وارد شدن به سیستم وانجام درخواست فعلی و آینده را بسیار سریع تر خواهد کرد.

اگر شما به عنوان مثال از youtube استفاده نمایید، بهتر است از https به جای http استفاده کنید.

فرض کنید یک سیستم ثبت نظر داشته باشید به صورت زیر خواهد بود:

public class Comment
{
    public int ID { get; set; }      // Primary key
    public int BlogID { get; set; }  // Foreign key
    public Blog Blog { get; set; }   // Foreign entity
    public string Name { get; set; }
    public string Body { get; set; }
    public bool Approved { get; set; }
}

حالا درست کردن یک view برای نظرات:

<div class="editor-label">
     @Html.LabelFor(model => model.Name)
 </div>
 <div class="editor-field">
     @Html.EditorFor(model => model.Name)
     @Html.ValidationMessageFor(model => model.Name)
 </div>

 <div class="editor-label">
     @Html.LabelFor(model => model.Body)
 </div>
 <div class="editor-field">
     @Html.EditorFor(model => model.Body)
     @Html.ValidationMessageFor(model => model.Body)
 </div>

زمانی که شما از فیلد approve استفاده می کنید اگر true باشد این نظرات که کاربران در سایت قرار می دهند پایین هر blog برای خود متن blog گذاشته نمی شود و به گونه ای نظرات هر متن با متن blog overwrite خواهد شد.

حالا چگونه می توانیم از آن جلوگیری نماییم؟

1-ارسال اطلاعات به یک viewmodel برای اینکه حاوی فیلدهایی که می خواهید آن را نمایش ندهید.

2-زمانی که شما صفت ها را ثبت می کنید ، فقط آن پارامترهایی را bind می کند که داخل لیست خود دارد و فقط به درخواست هایی پاسخ می دهد که در متد های خود دارد و هر درخواستی که خارج از متد و لیست خودش داشته باشد را پاسخ نمی دهد.

3-با استفاده از متد Updatemodel تمام کنترل هایی که overload شده اند چه آن هایی که در لیست خودش داشته باشد و چه درخواست هایی که از بیرون باشد همه ی آن ها را update می کنند.

زیر ارسال Modal data:

زیر ارسال از نظر امنیتی خطرناک است، که مورد بحث مسائل امنیتی مربوط به اعتبار سنجی مدل دارد، جزئیات امنیتی به asp.net mvc4 بر می گردد.

ترکیب کردن Windows Authorization با Forms Authentication:

از احراز هویت در یک برنامه پشتیبانی نمی کند، البته اگر شما در وب جستجو نمایید می توانید تکنیک هایی را انجام دهید، ولی این تکنیک ها شما را به استفاده از آن دلسرد خواهد کرد، به خاطر اینکه استفاده از آن بسیار دشوار خواهد بود

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید