PDA

View Full Version : پگونگی استفاده از Role در اعتبار سنجی کاربران .



Kaziveh
جمعه 29 خرداد 1394, 15:17 عصر
سلام . بنده در اعتبار سنجی کاربران با استفاده از Role دچار مشکل شده ام . وقتی از Role استفاده می کنم خای زیر رو دریافت می کنم :

The page isn't redirecting properly


کدهای نوشته شده من مانند زیر است :
[HttpGet]
[Authorize(Roles = "member")]
public virtual ActionResult Profile()
{
...
}
و متد SetAuthocooki :

private void SetAuthCookie(string memberName, string roleofMember, bool presistantCookie)
{
var timeout = presistantCookie ? FormsAuthentication.Timeout.TotalMinutes : 30;

var now = DateTime.UtcNow.ToLocalTime();
var expirationTimeSapne = TimeSpan.FromMinutes(timeout);

var authTicket = new FormsAuthenticationTicket(
1,memberName,now,now.Add(expirationTimeSapne),pres istantCookie,roleofMember,FormsAuthentication.Form sCookiePath
);

var encryptedTicket = FormsAuthentication.Encrypt(authTicket);
var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
{
HttpOnly = true,
Secure = FormsAuthentication.RequireSSL,
Path = FormsAuthentication.FormsCookiePath
};

if (FormsAuthentication.CookieDomain != null)
{
authCookie.Domain = FormsAuthentication.CookieDomain;
}

if (presistantCookie)
authCookie.Expires = DateTime.Now.AddMinutes(timeout);

Response.Cookies.Add(authCookie);
}

لطفا راهنمایی کنید ، مشکل از کجاست ؟در سایت دانت تپیس یه چیزهایی در مورد RoleProvider خوندم ولی نمی دونم باید کجا استفاده بشه

salar IT man
جمعه 29 خرداد 1394, 16:59 عصر
سلام . بنده در اعتبار سنجی کاربران با استفاده از Role دچار مشکل شده ام . وقتی از Role استفاده می کنم خای زیر رو دریافت می کنم :

The page isn't redirecting properly


کدهای نوشته شده من مانند زیر است :
[HttpGet]
[Authorize(Roles = "member")]
public virtual ActionResult Profile()
{
...
}
و متد SetAuthocooki :

private void SetAuthCookie(string memberName, string roleofMember, bool presistantCookie)
{
var timeout = presistantCookie ? FormsAuthentication.Timeout.TotalMinutes : 30;

var now = DateTime.UtcNow.ToLocalTime();
var expirationTimeSapne = TimeSpan.FromMinutes(timeout);

var authTicket = new FormsAuthenticationTicket(
1,memberName,now,now.Add(expirationTimeSapne),pres istantCookie,roleofMember,FormsAuthentication.Form sCookiePath
);

var encryptedTicket = FormsAuthentication.Encrypt(authTicket);
var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
{
HttpOnly = true,
Secure = FormsAuthentication.RequireSSL,
Path = FormsAuthentication.FormsCookiePath
};

if (FormsAuthentication.CookieDomain != null)
{
authCookie.Domain = FormsAuthentication.CookieDomain;
}

if (presistantCookie)
authCookie.Expires = DateTime.Now.AddMinutes(timeout);

Response.Cookies.Add(authCookie);
}

لطفا راهنمایی کنید ، مشکل از کجاست ؟در سایت دانت تپیس یه چیزهایی در مورد RoleProvider خوندم ولی نمی دونم باید کجا استفاده بشه

برای خطا اینجا (http://barnamenevis.org/showthread.php?392674-The-page-isn-t-redirecting-properly-%D9%87%D9%86%DA%AF%D8%A7%D9%85-%D8%B1%DB%8C%D8%AF%D8%A7%DB%8C%D8%B1%DA%A9%D8%AA-%DB%8C%DA%A9-%D8%B5%D9%81%D8%AD%D9%87)رو ببینید

شما به صورت دستی Role های کاربر را در تیکت داخل کوکی جاسازی میکنید و دیگه به Role Provider نیاز ندارید! Role Provider هم همین کار را خواهد کرد

Kaziveh
جمعه 29 خرداد 1394, 18:29 عصر
برای خطا اینجا (http://barnamenevis.org/showthread.php?392674-The-page-isn-t-redirecting-properly-%D9%87%D9%86%DA%AF%D8%A7%D9%85-%D8%B1%DB%8C%D8%AF%D8%A7%DB%8C%D8%B1%DA%A9%D8%AA-%DB%8C%DA%A9-%D8%B5%D9%81%D8%AD%D9%87)رو ببینید

شما به صورت دستی Role های کاربر را در تیکت داخل کوکی جاسازی میکنید و دیگه به Role Provider نیاز ندارید! Role Provider هم همین کار را خواهد کرد

درست که loop باعث این اتفاق می شود ، ولی کاربری که لاگین کرده است دارای همین role است و باید به او اجازه دهد Actionresult مورد نظر را ببیند . وقتی role را بر میدارم درست است .
مشکل از کجاست آقا سالار ؟

salar IT man
شنبه 30 خرداد 1394, 00:14 صبح
درست که loop باعث این اتفاق می شود ، ولی کاربری که لاگین کرده است دارای همین role است و باید به او اجازه دهد Actionresult مورد نظر را ببیند . وقتی role را بر میدارم درست است .
مشکل از کجاست آقا سالار ؟

احتمالا مشکل در کد شما است .
کد Action لاگین رو هم بذارین اینجا

Kaziveh
شنبه 30 خرداد 1394, 00:37 صبح
بیشتر قسمت های پروژه ام رو از پروژه شهر طلایی شما کمک گرفتم . این هم کد های لاگین :

[HttpGet]
public virtual ActionResult Login(string returnUrl)
{
if(User.Identity.IsAuthenticated)
{
if (IsValidReturnUrl(returnUrl))
return Redirect(returnUrl);
return Redirect(FormsAuthentication.DefaultUrl);
}
return View();
}
[HttpPost]
public virtual ActionResult Login(LoginViewModel loginVM, string returnUrl)
{
if (!ModelState.IsValid)
return View(loginVM);
int MemberId=0;
var result = _memberService.VerifyByUserName(loginVM.UserName, loginVM.Password,ref MemberId);
switch (result)
{
case VerifyMemberStatus.VerifiedSuccessfully:
{
var RoleOfTheMember = _roleService.GetRoleByMemberId(MemberId);
SetAuthCookie(loginVM.UserName, RoleOfTheMember.Name, loginVM.RememberMe);

_uow.SaveAllChanges();
if (IsValidReturnUrl(returnUrl))
return Redirect(returnUrl);
FormsAuthentication.RedirectFromLoginPage(loginVM. UserName, loginVM.RememberMe);
return RedirectToAction(MVC.Index.Index());
}
case VerifyMemberStatus.VerifiedFailed:
{
ModelState.AddModelError("UserName", "اطلاعات وارد شده صحیح نمی باشد");
ModelState.AddModelError("Password", "اطلاعات وارد شده صحیح نمی باشد");
break;
}
case VerifyMemberStatus.MemberIsBaned:
{
ModelState.AddModelError("UserName", "حساب کاربری شما مسدود شده است");
ModelState.AddModelError("Password", "حساب کاربری شما مسدود شده است");
break;
}

}

return View(loginVM);
}


ممنون میشم اگه راهنمایی کنید .

salar IT man
شنبه 30 خرداد 1394, 02:28 صبح
بیشتر قسمت های پروژه ام رو از پروژه شهر طلایی شما کمک گرفتم . این هم کد های لاگین :

[HttpGet]
public virtual ActionResult Login(string returnUrl)
{
if(User.Identity.IsAuthenticated)
{
if (IsValidReturnUrl(returnUrl))
return Redirect(returnUrl);
return Redirect(FormsAuthentication.DefaultUrl);
}
return View();
}
[HttpPost]
public virtual ActionResult Login(LoginViewModel loginVM, string returnUrl)
{
if (!ModelState.IsValid)
return View(loginVM);
int MemberId=0;
var result = _memberService.VerifyByUserName(loginVM.UserName, loginVM.Password,ref MemberId);
switch (result)
{
case VerifyMemberStatus.VerifiedSuccessfully:
{
var RoleOfTheMember = _roleService.GetRoleByMemberId(MemberId);
SetAuthCookie(loginVM.UserName, RoleOfTheMember.Name, loginVM.RememberMe);

_uow.SaveAllChanges();
if (IsValidReturnUrl(returnUrl))
return Redirect(returnUrl);
FormsAuthentication.RedirectFromLoginPage(loginVM. UserName, loginVM.RememberMe);
return RedirectToAction(MVC.Index.Index());
}
case VerifyMemberStatus.VerifiedFailed:
{
ModelState.AddModelError("UserName", "اطلاعات وارد شده صحیح نمی باشد");
ModelState.AddModelError("Password", "اطلاعات وارد شده صحیح نمی باشد");
break;
}
case VerifyMemberStatus.MemberIsBaned:
{
ModelState.AddModelError("UserName", "حساب کاربری شما مسدود شده است");
ModelState.AddModelError("Password", "حساب کاربری شما مسدود شده است");
break;
}

}

return View(loginVM);
}


ممنون میشم اگه راهنمایی کنید .

مشکل در Action Get مربوط به Login هستش!
منطقی هم است وقتی کار بر لاگین کرده عملا احراز هویت شده است ولی اگه رول مورد نظر را نداشته باشد حتما به صفحه لاگین ردایرکت خواهد شد ، و شما در این اکشن چک کردید که اگر کاربر احراز هویت شده بود او را ردایرکت کن به return Url که اگر return Url شما هم همون Action ای است که نیاز به دسترسی member داشت در این صورت Loop اتفاق خواهد افتاد!!!!!

این قسمت را پاک کنید:



if(User.Identity.IsAuthenticated)
{
if (IsValidReturnUrl(returnUrl))
return Redirect(returnUrl);
return Redirect(FormsAuthentication.DefaultUrl);
}

Kaziveh
یک شنبه 31 خرداد 1394, 13:44 عصر
اگه اون قسمت رو پاک کنم اونوقوت کاربری که لاگین کرده است وقتی درخواست صفحه لاگین را می کند باز نشان می دهد در صورتی که نباید به کاربری که لاگین کرده است صفحه لاگین را نشان داد .
کار اعتبار سنجی شده است فقط وقتی که Role را اضافه می کنم این Loop اتفاق می افتد .
آخرش هم نفهمیدم مشکل از کجاست و باید چکار کنم ؟

salar IT man
یک شنبه 31 خرداد 1394, 14:23 عصر
اگه اون قسمت رو پاک کنم اونوقوت کاربری که لاگین کرده است وقتی درخواست صفحه لاگین را می کند باز نشان می دهد در صورتی که نباید به کاربری که لاگین کرده است صفحه لاگین را نشان داد .
کار اعتبار سنجی شده است فقط وقتی که Role را اضافه می کنم این Loop اتفاق می افتد .
آخرش هم نفهمیدم مشکل از کجاست و باید چکار کنم ؟

مشکل را گفتم چطور نفهمیدید!!

کاربری که صفحه لاگین را در صورت لاگین بودن بخواد اول LogOut کنیدش بعد صفحه رو نشون بدید.



[HttpGet]
public virtual ActionResult Login(string returnUrl)
{

if(User.Identity.IsAuthenticated)
FormsAuthentication.SignOut();
return View();
}