Best Practice ی برای تأیید اعتبار کردن کاربران در ASP.NET MVC 4
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه

به صورت پیش فرض دسترسی به تمامی اکشن‌ها مجاز است مگر اینکه آن اکشن به تگ Authorize مزین شود.
حال Best Practice این است که حتی اگه شما یک یا دو اکشنی دارید که نیاز است کاربرای خاصی به آن‌ها دسترسی داشته باشند بهتر است که دسترسی به تمام اکشن‌ها محدود شود و بعد آن اکشن‌هایی که نیاز است دسترسی عمومی داشته باشند، بهشون دسترسی داده بشه. در واقع هدف از این Best Practice جلوگیری از قلم افتادن یک اکشن به اشتباه، هنگام دادن تگ Authorize هست. 

خوب، برای انجام اینکار از فیلترهای سفارشی سراسری (Global Filters) استفاده می‌کنیم. کافیه خط زیر رو به کلاس FilterConfig اضافه کنید.
filters.Add(new AuthorizeAttribute());
با این کار تمام اکشن‌های شما با تگ Authorize مزین می‌شوند و تمام دسترسی‌ها محدود.

نکته: این روش تا قبل از ASP.NET MVC 4 فقط برای سیستم‌هایی که هیچ اکشنی با دسترسی عمومی نداشتن جوابگو بوده و در صورت داشتن چنین اکشنی این روش جوابگوی شما نیست. ولی از ASP.NET MVC 4 به بعد با اضافه شدن تگ [AllowAnonymous] این مشکل حل شده.

حالا که تمامی اکشن‌ها محدود شدن، حالا نوبت به اکشن‌هایی می‌رسه که دسترسی عمومی به اونها آزاده.
برای این کار به راحتی از تگ [AllowAnonymous] استفاده می‌کنیم
[AllowAnonymous]
public ActionResult Index()
  {
       return View();
   }

فایل پرو‍ژهBestPracticeForAuthenticatingUsers.rar
  • #
    ‫۱۰ سال و ۱۲ ماه قبل، چهارشنبه ۳ مهر ۱۳۹۲، ساعت ۱۲:۵۳
    سلام . من برای پروژه ام همین کارو کردم . صفحه اول من از توی یک ناحیه(Area) لود میشه . به این صورت که درخواست میره به یک اکشن مثل Home از کنترلر ControlPanel که این اکشن Allow Anonymous هست . بعد از داخل اون Redirect میشه به همون Area و داخل اون هم یه کنترلر Home و یه اکشن Index هست .
    اما موقع لود شدن redirect میشم به صفحه لاگین. لطفا راهنمایی کنید.
    • #
      ‫۱۰ سال و ۱۲ ماه قبل، چهارشنبه ۳ مهر ۱۳۹۲، ساعت ۱۳:۱۲
      «بعد از داخل اون Redirect میشه» خودکار هست یا دستی؟ اگر خودکار هست، خوب طبیعی هست جایی که AllowAnonymous نداره (یعنی اکشن متد بعدی که به اون Redirect شده)، کاربر رو به صفحه لاگین هدایت کنه. Global Filters یعنی دقیقا همین. یعنی اعمال سراسری به همه جا، مگر اینکه با AllowAnonymous مستثنی شود.
      • #
        ‫۱۰ سال و ۱۲ ماه قبل، چهارشنبه ۳ مهر ۱۳۹۲، ساعت ۱۳:۳۲
        اره خب حرفه شما درسته . اما هر دوتا اکشن من AllowAnonymous هست . در واقع از یک اکشن AllowAnonymous  میخوام برم به یه اکشن AllowAnonymous   داخل یه ناحیه . مشکل اینجاست که نمیره و میره تو صفحه لاگین . 
        • #
          ‫۱۰ سال و ۱۲ ماه قبل، چهارشنبه ۳ مهر ۱۳۹۲، ساعت ۱۳:۴۹
          ممکن هست در اون صفحه دوم داری چیزی رو نمایش می‌دی که ارجاعی داره به یک اکشن متد محافظت شده. مثلا صفحه‌ات چند قسمتی هست. یک قسمت داره از یک اکشن متد غیر عمومی شده اطلاعات دریافت می‌کنه.
  • #
    ‫۱۰ سال و ۳ ماه قبل، سه‌شنبه ۳ تیر ۱۳۹۳، ساعت ۱۹:۰۴
    سوال من اینه که اگه بخواهیم این محدودیت رو محدودتر کنیم[مثلا فقط نقش abc] دسترسی داشته باشه، اونوقت باید [Authorize(Roles="abc")] رو روی اکشن بگذاریم؟
    • #
      ‫۱۰ سال و ۳ ماه قبل، چهارشنبه ۴ تیر ۱۳۹۳، ساعت ۰۲:۳۶
      اگه قراره روی فقط رو یه اکشن اعمال بشه درسته میتونی حتی میتونی روی کنترلر بزاری که تمام اکشن‌های اون کنترلر رو محدود کنه و اگه میخوای با روشی که تو این پست اومده عمل کنی باید خودت یک Authorize Attribute سفارشی بنویسی و به فیلترهای سراسری ت  ادد کنی.