PDA

View Full Version : session



resident
سه شنبه 29 مرداد 1392, 15:31 عصر
سلام.

من UserID رو از Sessionمیخونم و تقریبا تو همه Action هام به UserID نیاز دارم. آیا راهی وجود داره که اول هر کنترلر بیام مقدار UserID رویکبار بخونم و داخل یه متغیر بریزم بعد همه Action ها از اون متغیر بخونن؟ یا اینکه مجبورم داخل هر اکشن یکبار از سشن بخونم:ناراحت:

ali_autumnal
سه شنبه 29 مرداد 1392, 16:26 عصر
اصلا نیازی به session ندارید session واسه asp قدیم هست. نه واسه MVC

شما UserName از var My = User.Identity بخونید و به مراتب با استفاده از UserName ، از UserProfile
UserId بخونید

یا UserId که با اول از UserProfie خوندید رو توسط TempData به Action های دیگه پاس بدید

resident
سه شنبه 29 مرداد 1392, 17:04 عصر
اولش با این روش رفتم ولی نکته ای که بود این بود که من RoleID و RoleName کاربر رو هم علاوه بر UserID میخوام که Identity نداره.
به همین دلیل رفتم سراغ سشن

resident
سه شنبه 29 مرداد 1392, 17:13 عصر
شما UserName از var My = User.Identity بخونید و به مراتب با استفاده از UserName ، از UserProfile
UserId بخونید

منظورتون اینه که Select بزنم رو جدول یوزرهام و با استفاده از UserName بقیه اطلاعات موردنظرمو بدست بیارم؟

ali_autumnal
سه شنبه 29 مرداد 1392, 17:43 عصر
آره دقیقا

چه لزومی داره Role ها رو بخونید. خود Authorize این کارو انجام میده



[InitializeSimpleMembership]
[Authorize(Roles = "Administrator")]

hakim22
سه شنبه 29 مرداد 1392, 18:11 عصر
کنترلر ها هم یک کلاس هستند و شما می توانید با ساختن متدی هم نام اسم کلاس درون همون کنترلر اون کلاس رو Initialize کنید. و مقدار متغیر خاصی رو تعیین کنید.

resident
سه شنبه 29 مرداد 1392, 18:35 عصر
کنترلر ها هم یک کلاس هستند و شما می توانید با ساختن متدی هم نام اسم کلاس درون همون کنترلر اون کلاس رو Initialize کنید. و مقدار متغیر خاصی رو تعیین کنید.
حکیم جان داخل سازنده ، سشن ، نال میشه. چرا؟؟؟؟

resident
سه شنبه 29 مرداد 1392, 18:44 عصر
آره دقیقا

چه لزومی داره Role ها رو بخونید. خود Authorize این کارو انجام میده



[InitializeSimpleMembership]
[Authorize(Roles = "Administrator")]


آخه من Role هام 3ابت نیست و مدیر سیستم می تونه Role های مختلفی رو خودش تعریف می کنه و هر کدوم از Role ها هم سطح دسترسی های خودشونو دارن.
با این وضعیت اگه از Authorize استفاده کنم مشکلی ایجاد نمی شه؟

hakim22
سه شنبه 29 مرداد 1392, 22:47 عصر
درسته که null هست ولی تا جایی که من یادمه بعد از بارگذاری view مقدار دهی میشه و این عملیات قبل از بارگذاری Action صورت میگیره.

ali_autumnal
سه شنبه 29 مرداد 1392, 23:06 عصر
آخه من Role هام 3ابت نیست و مدیر سیستم می تونه Role های مختلفی رو خودش تعریف می کنه و هر کدوم از Role ها هم سطح دسترسی های خودشونو دارن.
با این وضعیت اگه از Authorize استفاده کنم مشکلی ایجاد نمی شه؟

در اینصورت نمی تونید از Authorize استفاده کنید.

هر چند کار شما هم زیاد جالب نیست.
مدیر بایستی بتونه طبق Roleهای تعریف شده در سیستم (توسط برنامه نویس) به کاربران Roleهایی اختصاص بده. مثلا به کاربری 3نوع Role بده و به کاربری یک نوع والی آخر. برنامه نویس هم طبق (تحلیل های انجام شده) این Roleها رو استفاده می کنه.

younesdoost
چهارشنبه 30 مرداد 1392, 00:10 صبح
نه.من فکر میکنم اینکه مدیر بتونه Role ها رو ایجاد کنه بهتر باشه.بنظر من اون چیزی که باید از قبل وجود داشته باشه و غیر قابل ایجاد باشه مثلا UserType هستش که میتونه یه enum از 4 5 نوع یوزر باشه مثل Admin , Super Admin,...
شما یه کلاس CustomAuthentication درست کنید و داخلش url درخواست شده رو به کنترلر و اکشنش بشکونید و برید ببینید کاربری با این UserType به این کنترلر و اکشن دسترسی داره یا نه(جدولای دیتابیسش رو تحلیل کنید خودتون).اگه داشته جواب true بده اگه نه false.
بعد اونوقت می تونید با اتریبوتای زیر کاربرای خودتون رو بررسی کنید که آیا با این صفحه دسترسی دارن یا نه.البته خیلی خلاصه گفتم ولی کلا سناریوی کار اینه.حالا سعی کنید تحلیلش کنید اگه سوالی داشتید خوشحال میشم بتونم جواب بدم.

[Authorize]
[CustomAuthentication]

اما در مورد اولین پست شما من از یه تابع استاتیک استفاده میکنم که همون User.Identity.Name رو بهش میدم و کاربر رو برمی گردونه و هر کاری بخوام میتونم انجام بدم باهاش.

resident
چهارشنبه 30 مرداد 1392, 09:51 صبح
طبق فرمایش شما کارهای زیر رو انجام دادم:


اول تعریف این کلاس:


public static class CustomAuthentication
{
public static bool GetAuthenticationForm(ControllerContext controllerContext)
{
string controllerName = controllerContext.RouteData.Values["Controller"].ToString();
string actionName = controllerContext.RouteData.Values["Action"].ToString();
اینجا هم دسترسی ها چک میشه.... ما فرض کردیم اجازه داره
return true;
}




}


بعد اومدم توی اکشن Create نوشتم:

[Authorize]
[CustomAuthentication]
public ActionResult Create()
{
CustomAuthentication.GetAuthenticationForm(Control lerContext);
return View();



}


اینجای کارم یه مشکلی داره ولی نمیدونم چیه. 2 مورد:
1-آیا باید CustomAuthentication.GetAuthenticationForm(Control lerContext);رو داخل هر اکشن صدا کنم؟ به نظر خودم نباید اینطور باشه ولی نمیدونم درستش چیه...
2- روی خط پایینی Authorizeیعنی CustomAuthenticationارر زیر رو میده:
MyApp.MVC.Class.CustomAuthentication' is not an attribute class

ممنون از راهنمایی هاتون

younesdoost
چهارشنبه 30 مرداد 1392, 10:11 صبح
سلام.
بله کاملا درست دارید انجامش میدید فقط چند تا مورد:
در مورد سوال اولتون اینکه، خب اگه بخواید می تونید تو کل کنترلر خودتون این Authentication رو انجام بدید.فقط کافیه اون 2 تا اتربیوت رو ببرید بالا.مثل زیر:

[Authorize]
[CustomAuthentication]
public class YourController : Controller
{
...
}

در مورد سوال دومتون اینکه ارورش درسته.چونکه کلاس CustomAuthentication شما باید از AuthorizeAttribute ارث ببره.اینطوری:

public class CustomAuthentication : AuthorizeAttribute
{
...
}


پس حالا با انجام کارای بالا یه مورد دیگه رو هم باید رعایت کنید.وقتی ارث بری بالا انجام شد دیگه کنترلر و اکشن جدا ورودی مناسبی برای کلاس CustomAuthentication نیست.اینطوری کنیدش:

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
اینجا دسترسی رو چک کنید و نتیجه ی true یا false رو برگردونید.
}

باز تو هر جای کار به مشکل برخوردید من در خدمتم.

resident
پنج شنبه 31 مرداد 1392, 10:10 صبح
younesdoost جان کارهایی که شما گفته بودید رو انجام دادم.وقتی برنامه رو اجرا می کنم مثلا وقتی میخوام فرم City رو باز کنم بعد از AuthorizeCore (وقتی True برمیگردونه) همچین Url ای رو میخواد اجرا کنه که خب نمیتونه...!!!!!

http://localhost:3641/Login/Index?ReturnUrl=%2fCity%2f

چکار باید کرد؟

younesdoost
پنج شنبه 31 مرداد 1392, 20:55 عصر
یه همچین متدی توی همون کلاس CustomAthentication ایجاد کنید:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "action", "NotAuthorized" }, { "controller", "Account" } });
}

و تو کنترلر Account:

[Authorize]
public string NotAuthorized()
{
return "You don't have access to this part.";
}

یه مورد دیگه هم اینکه اروری که شما میگید یکم به نظرم غیر منطقی میاد.
چونکه شما تو AuthorieCore وقتی می خواید چک کنید دسترسی رو UserId کاربر فعلی رو می فرستید و دسترسی رو می خونید.وقتی کاربر لاگین کرده چطور بر می گرده به صفحه ی لاگین؟
من تو دیتابیس 3 تا جدول دارم.User,UserRole,Role
جدول یوزر دارای یک UserTypeId هستش.
جدول UserRole برای هر UserTypeId یک(یا بیشتر از یک) RoleId داره و یه فیلد Access که می تونه True و False باشه.
جدول Role هم دارای یه فیلد Controller و Action هستش.
حالا تو AuthorizeCore من با استفاده از نام Controller و Action همونجا Role مربوط به این دو رو می خونم.بعد UserTypeId کاربر فعلی و RoleId رو میفرستم که ببینم بهم یه UserRole بر می گردونه یا نه.اگه برگردوند میبینم Access چی هست.true یا false.

resident
پنج شنبه 31 مرداد 1392, 22:19 عصر
younesdoostجان مشکل رو پیدا کردم....به جای


[Authorize]
[CustomAuthentication]

باید فقط


[CustomAuthentication]

بذاریم
ازتون واقعا ممنونم. خیلی کمکم کردید

younesdoost
پنج شنبه 31 مرداد 1392, 22:30 عصر
خواهش می کنم دوست من.البته من هر دو تا اتربیوتو میذارما.اگه با برداشتن اون مشکل حل شده شاید یه جای دیگه ی کار ایراد داره(web.config رو چک کنید).
ولی بهرحال این روش پسندیده ای هستش برای Custom Authentication.خوشحالم تونستم کمک کنم.

resident
پنج شنبه 31 مرداد 1392, 22:33 عصر
تو web.config چی رو چک کنم؟

younesdoost
پنج شنبه 31 مرداد 1392, 22:44 عصر
نگاه کنید ببینید آیا کد بازگشت به صفحه ی لاگینتون(تگ authentication) با آدرس Routing لاگینتون برابره؟یعنی اینطوریه:

<authentication mode="Forms">
<forms loginUrl="~/Login/Index" timeout="2880" />
</authentication>

resident
پنج شنبه 31 مرداد 1392, 22:49 عصر
بله درسته

اینطوره:

<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

در کنترلر Account اکشن login رو دارم برای ورود به سیستم.

kingmech
جمعه 01 شهریور 1392, 20:32 عصر
younesdoostجان مشکل رو پیدا کردم....به جای


[Authorize]
[CustomAuthentication]

باید فقط


[CustomAuthentication]

بذاریم
ازتون واقعا ممنونم. خیلی کمکم کردید

از دید بنده هم [CustomAuthentication] کافی هست بخاطره اینکه وقتی این مورد رو کاربر داره که لوگین کرده باشه سطح دسترشیش رو گرفته باشه

younesdoost
جمعه 01 شهریور 1392, 22:57 عصر
سلام.نظر شماها درسته.منطقی میگید.همون کافیه.ببخشید دیر جواب دادم.داشتم سعی می کردم مشکلی پیدا کنم اما چیزی ندیدم.

sunn789
چهارشنبه 10 اردیبهشت 1393, 20:29 عصر
اصلا نیازی به session ندارید session واسه asp قدیم هست. نه واسه MVC

شما UserName از var My = User.Identity بخونید و به مراتب با استفاده از UserName ، از UserProfile
UserId بخونید

یا UserId که با اول از UserProfie خوندید رو توسط TempData به Action های دیگه پاس بدید
سلام
من یه جایی گیر کردم اینه که زمانی یه کاربر نام کاربری و کلمه عبور رو وارد میکنه در کنترل MVC به چه نحو User رو پر میکنه ، شما فرمودین از سشن دیگه استفاده نمیکنه خوب چه جوری User رو پر کنم
ممنون میشم

ali_autumnal
چهارشنبه 10 اردیبهشت 1393, 22:06 عصر
User توسط asp بصورت خودکار پرمیشه!
شما در اکشن فقط کافیه دستور var My = User.Identity بنویسید.