تا به اینجا کاربر هر کاری بخواهد در سطح پروژه میتواند انجام دهد . میتواند یک رکورد رستوران جدید بسازد ، Edit کند و خلاصه به اندازه کل توان سیستم دستش باز است . سناریوی من این است که کاربر Login نکرده فقط بتواند لیست رستورانها را ببیند.
بسمه تعالی
ASP.NET Core 1 – قسمت سی و پنجم
تا به اینجا کاربر هر کاری بخواهد در سطح پروژه میتواند انجام دهد . میتواند یک رکورد رستوران جدید بسازد ، Edit کند و خلاصه به اندازه کل توان سیستم دستش باز است . سناریوی من این است که کاربر Login نکرده فقط بتواند لیست رستورانها را ببیند. این منطبق با Authorize Attribute بدست می آید . این Attribute را میتوان برای همه Controller یا بعضی از Action ها قرار داد.اگر یک متد دارای این Attribute باشد ، قبل از اجرا شدن روالهای Login کنترل شده و اگر کاربر لاگین نباشد ، به صفحه لاگین ارجاع داده خواهد شد.
اگر این Attribute را بدون هیچ پارامتری بکار ببریم فقط لاگین بودن کاربر کنترل خواهد ، ولی اگر از طریق پارامتر Role کاربر هم مشخص شود ، عملن فقط کاربرهای در آن Role میتوانند آن Action را اجرا و نتیجه آنرا داشته باشند.

اگر همه یک Controller را از طریق این Attribute برای کاربر Anonymous غیر قابل دسترسی کردیم ، ولی یک یا چند متد باید آزاد باشد ، می توان از AllowAnonymous به عنوان یک Attribute استفاده کرد و آنها را استثنا نمود.
خوب برویم مراحل استفاده را در پروژه ببینیم.
در حال حاضر همه امکان Edit یک رکورد را دارند . سعی میکنیم وضعیت دسترسیها را در HomeController سر و سامان دهیم. اگر بخواهم همه متدها نیاز به Authenticate شدن داشته باشد ، به صورت زیر عمل میکنم.

با انجام این تغییرات ، دیگر عمل سیستم را به یک WebApplication تبدیل کردم . قبلن شاید اندکی روی کرد وب سایت داشتیم. هیچ کاربری الان دیگر بدون Loginکردن هیچ کاری نمی تواند انجام دهد ، چرا که کل کلاس را با استفاده از این Attribute نیازمند لاگین کردن نمودیم. برای اینکه حدافل کاربرها بتواند وارد Home Page بشوند و لیست رستورانها را بدون نیاز به Login بودن ببینند ، این متد را به شکل زیر استثنا می کنیم.

پروژه را Save و اجرا کنید . خوب لیست به درستی نمایان است ، ولی اگر یک F12 بزنیم و از Developer Tools وارد قسمت Network شویم ، با کلیک بر روی Details به وضعیتی مشابه زیر خواهید رسید.

خوب این نشان میدهد که کاربر دسترسی لازم را ندارد ، ولی وضعیت فعلی کمی مبهم است . کاربر هیچ پیام یا عبارتی دریافت نکرده و یا به صفحه لاگین پرتاب نمی شود . علت این مساله نبود تنظیمات Identity در سطح پروژه است. برای حل این مشکل ، به قسمت بعدی باید توجه فرمایید.
دانلود سورس پروژه