سلام
اینطوری عمل کنید :
اگر کاربر شما با موفقیت login کرده باشد آنگاه یک authentication ticket برای او در نظر بگیرید به صورت زیر (این دستور باید دقیقا پس از دستورات login نوشته شود و چک شود که در صورتی که login با موفقیت انجام شده باشد .) :
FormsAuthentication.SetAuthCookie(username,false);
بعد ها از این کوکی استفاده خواهیم کرد ...
چون ما از forms authentication استفاده می کنیم پس باید بدانیم که Asp.Net Framework آبجکت IPrinciple را جهت اهراز هویت کاربران چک خواهد کرد
ID , Role داخل این آبجکت تعیین کننده دسترسی و یا عدم دسترسی کاربر به صفحات وب خواهد بود و تا کنون ما کدی در ارتباط با این آبجکت ننوشته ایم !
میشه گفت که formsauthentication از این کاربر بی خبر است !
پس در این مرحله برای رفع این مشکل باید با override کردن متد FormsAuthentication_OnAuthenticate داخل فایل global.asax شناسایی کاربر به formsauthentication را میسر کنیم .
protected void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs e)
{
if (FormsAuthentication.CookiesSupported == true)
{
if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
{
try
{
string userName = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value).Name;
string roles = mydb.getUserRoles(userName);
e.User = new System.Security.Principal.GenericPrincipal(new System.Security.Principal.GenericIdentity(userName , "Forms"), roles.Split(','));
}
catch (Exception ex)
{
}
}
}
}
خوب چن تا مطلب در مورد کد بالا بگم دوتا دستور if اول که تنظیمات authentication و قابلیت هاشونو چک می کنند
اگر شرط ها درست باشن داخل بلوک try میشیم :
دستورات : string userName = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value).Name;
string roles = dbHelper.getUserRoles(userName);
نام کاربری و role کاربر را در متغییر های username , roles ذخیره می کنند .
دستور : e.User = new System.Security.Principal.GenericPrincipal(new System.Security.Principal.GenericIdentity(userName , "Forms"), roles.Split(','));
میاد principal مورد نظرمونو واسه کاربر رایج می سازه پس الان می تونیم این کاربرو به راحتی authorize کنیم یعنی درمورد دسترسیش به صفحات وب تصمیم گیری کنیم .
درضمن چون من چندین role برای کاربرا درنظر گرفتم از متد split() برای جداسازی استفاده کردم تا role هامو جدا کنم
مثلا یه کاربر می تونه هم زمان هم ادمین باشه هم مدیر به این شکل username:admin, roles=admin;manager
همه چی انجام شد
در مرحله آخر میریم داخل فایل وب کانفیگ پوشه ای که صفحات ادمین داخلش هست و اجازه دسترسی رو به صورت زیر تعیین می کنیم :
<authorization>
<allow roles="admin" />
<deny users="*" />
</authorization>
امیدوارم استفاده لازم رو برده باشی
موفق باشی