PDA

View Full Version : سوال: داشتن دو صفحه ی لاگین؟!



hamid1988
دوشنبه 09 شهریور 1388, 12:04 عصر
در پروژم دو صفحه ی لاگین دارم (یکی برای اعضا، دیگری برای مدیر در داخل پوشه ی Admin) در داخل پوشه ی Admin یک WebConfig قرار می دم و Autonticationاش رو تنظیم می کنم اما خطا میده!
اگه راه حلی به نظرتون میرسه لطفاَ بفرمایید!
(این رو هم بگم که نمی خوام از رول ها استفاده کنم!)
مرسی

m.hamidreza
دوشنبه 09 شهریور 1388, 12:59 عصر
روش شما غلط نیست. متن خطا رو بذارید. خطاهای اینجوری معمولا به IIS برمیگرده.
موفق باشید.

hamid1988
دوشنبه 09 شهریور 1388, 13:15 عصر
روش شما غلط نیست. متن خطا رو بذارید. خطاهای اینجوری معمولا به IIS برمیگرده.

درسته!
دقیقاَ در مورد IIS خطا می گیره، اما من File System کار کردم!
اینم عکس خطا...

hamid1988
دوشنبه 09 شهریور 1388, 18:08 عصر
کسی نمیدونه برای رفع این اررور چی کار باید بکنم؟!

مهدی کرامتی
دوشنبه 09 شهریور 1388, 21:49 عصر
این رو هم بگم که نمی خوام از رول ها استفاده کنم!منظورت عدم استفاده از مکانیسم پیش فرض Role ها در خود ‎‎.Net است، و یا از مکانیسم RoleProvider هم نمی خواهی استفاده کنی؟
شما می تونی با استفاده از مکانیسم RoleProvider موجود در ‎‎.Net بدون استفاده از امکانات پیش فرض خود ‎‎.Net (و استفاده از Web Site Administration Tools و ...) از مزایای اون سیستم استفاده کنی.

برای انجام این کار کافیه یک رویه برای تمایز انواع کاربران در جایی مثل Database ات داشته باشی.

اگر تمایل داری بگو تا بقیه اش رو هم توضیح بدم.

hamid1988
دوشنبه 09 شهریور 1388, 23:26 عصر
از رول ها (چه مال خود دات نت و چه مال Role Provider) نمی خوام استفاده کنم به دو دلیل:
1- در پروژم نیازی نبود که از رول ها استفاده کنم.
2- دیتابیسم رو به زور در هاست آپلود کردم (بعد از دو روز و ارسال ایمیل های فراوان!) و دیگه نمیتونم تغییرش بدم!
لطفاَ بگید، چه طور میتونم Errorای که عکسش رو در 2 پست بالاتر گذاشتم رو رفع کنم!
مرسی.

مهدی کرامتی
سه شنبه 10 شهریور 1388, 00:19 صبح
1- شما نمی توانید بیش از یک صفحه لاگین در برنامه تان داشته باشید. در Web.Config فقط یک صفحه لاگین را می توان معرفی کرد.
2- اگر تعریفات Authentication را بجای Web.Config موجود در Root پروژه در فایل Web.Config ای که در فولدر Admin (یا ...) قرار داده اید اضافه کنید خطای فوق را مشاهده خواهید کرد.
3- مگر شما در دیتابیس رویه ای برای جدا کردن انواع کاربران ندارید؟ (منظورم صرفا Role نیست، جدا کردن کاربران عادی، مدیر، و ...؟)

hamid1988
سه شنبه 10 شهریور 1388, 02:23 صبح
1- 3- مگر شما در دیتابیس رویه ای برای جدا کردن انواع کاربران ندارید؟ (منظورم صرفا Role نیست، جدا کردن کاربران عادی، مدیر، و ...؟)
چرا...کاربران عادی در جدول Members هستند مدیر در جدول Admin!

aynehband
سه شنبه 10 شهریور 1388, 03:03 صبح
برای این کار ، نقش کاربرت را که خودت داری در session بگذار و بعد در صفحاتت چک کن، اما اگر می خواهی خود asp چک کنه ، فکر کنم باید از همون RoleProvider استفاده کنی، چون اون موقع به فایل ها دسترسی داره.

مهدی کرامتی
سه شنبه 10 شهریور 1388, 03:20 صبح
کاری که الان قراره انجام بدیم تربیت کردن سیستم RoleProvider دات نت برای تطبیق با نیاز شماست.

1- یک کلاس بنام MyRoleProvider.cs به پروژه تان اضافه کنید.

2- جنس Parent این کلاس را RoleProvider تعریف کنید. برای استفاده از این کلاس می بایست نیم اسپیس System.Web.Security را Import کرده باشید (در لیست using ها اضافه کنید).

3- اکنون نوبت به ارث بردن قالب کلاس پدر است. روی نام RoleProvider در خط تعریف کلاس کلیک کنید و Alt+Shift+F10 را فشار دهید. گزینه Implement Abstract Class 'RoleProvider' را انتخاب کنید. همانطور که می بینید عضوهای لازم برای سازگار بودن کلاس شما با قالب RoleProvider به کلاس شما اضافه می شوند. خیلی هستند، نه؟
نترسید. ما با همه اینها کار نداریم.

4- تنها متدی که ما در این کلاس میبایست پیاده سازی کنیم متد GetRolesForUser است. کار این متد تهیه فهرست Role های کاربر لاگین شده و ارائه آنها به دات نت است. اینجا به شناسه (ID) یا نام کاربر (Username) کاربر لاگین شده نیاز داریم. اما آن را از کجا بدست بیاوریم؟
در صفحه لاگین پس از اینکه مجاز بودن کاربر در دیتابیس را چک کردید بالطبع متد RedirectFromLoginPage از کلاس FormsAuthentication را برای صدور بلیط ورود کاربر به سیستم فراخوانی می کنید. پارامتر اول این متد شناسه ای از کاربر خواهد بود که بعدا برای پیدا کردن کاربر در سیستم از آن استفاده خواهیم کرد، مثلا:
FormsAuthentication.RedirectFromLoginPage(txtUsern ame.Text, true);
مقداری که بعنوان پارامتر اول به این متد پاس می دهید بعدا بصورت خودکار بعنوان پارامتر به متد GetRolesForUser پاس می شود. بنابراین کافی است در متد فوق با استفاده از نام کاربر بررسی کنید آیا این کاربر اجازه دسترسی به فولدر Admin را دارد یا نه. اگر داشت در String Array خروجی کلمه Administrator را اضافه کنید. مثال:
public override string[] GetRolesForUser(string username)
{
string[] roles = new string[1];

if(CheckIfUserIsInAdminTable(username) == true)
{
roles[0] = 'Administrator';
}
return roles;
}


5- قدم بعدی معرفی این کلاس بعنوان RoleProvider این پروژه است. در Web.Config در خط بعد از <system.web> تنظیمات زیر را اضافه کنید:
<roleManager enabled="true" defaultProvider="MyRoleProvider">
<providers>
<clear />
<add name="MyRoleProvider" type="YourApplicationName.MyRoleProvider" />
</providers>
</roleManager>

با این کار به دات نت می گوئیم از مکانیسم Role Management داخلی خود استفاده نکند و بجای آن از کلاس ما برای مدیریت Role ها استفاده کند. دقت کنید که بجای YourApplicationName نام Name Space پیش فرض پروژه خودتان را قرار دهید.

6- آخرین کاری که نیاز دارید این است که در فولدر Admin طوری تنظیمات انجام دهید که فقط کاربرانی که دارای نقش Administrator باشند اجازه ورود داشته باشند. برای انجام این کار یک فایل بنام Web.Config در فولدر Admin تان بسازید و این تنظیمات را درون آن قرار دهید:
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<allow roles="Administrator" />
<deny users="*" />
</authorization>
</system.web>
</configuration>

با استفاده از این تنظیمات فقط کاربرانی که بنا بر تشخیص کلاس MyRoleProvider دارای نقش Admin هستند اجازه دسترسی به صفحات درون فولدر Admin را خواهند داشت.

موفق باشید.

hamid1988
سه شنبه 10 شهریور 1388, 13:18 عصر
DelphiAssistant عزیز دستت درد نکنه!
دو سوال دارم:
1-
CheckIfUserIsInAdminTable(username)
رو چطور بنویسم؟دوباره Select بزنم؟دوباره کاری نمیشه؟!
2-اگه UserName موجود در جدول Admin و جدول Members یکی باشن، به اون Member هم اجازه ی دسترسی به قسمت Admin رو میده/نمیده؟

مهدی کرامتی
سه شنبه 10 شهریور 1388, 13:29 عصر
1- تصمیمش بعهده شماست. ولی جایی که لازم باشه اشکال نداره دوباره از دیتابیس اطلاعاتی رو بخوانید.

2- شما میبایست وجود کاربر فوق در جدول Admin رو بررسی کنید. بهتره اجازه ندهید نام کاربر تکراری در جداول تان ثبت شود (با استفاده از یک CustomValidator موقع ثبت نام کاربر). بهتر از آن این بود که جدول کاربران و مدیران تان یکی بود و با یک فیلد UserType نوع کاربر را مشخص می کردید.

hamid1988
سه شنبه 10 شهریور 1388, 14:26 عصر
الان من مجبورم بازم یک صفحه ی لاگین داشته باشم!
صفحه ی لاگینی که برای ادمین در نظر گرفتم در پوشه ی ادمین قرار داره، اما لاگینی که برای اعضا در نظر گرفتم در ریشه قرار داره در حالی که چون در Web.Config اصلی نوشتم:

<authentication mode="Forms" >
<forms loginUrl="~/login.aspx" name=".ASPXAUTH" protection="Encryption">
</forms>
</authentication>
و ادمین وقتی SiteName/admin رو تایپ میکنه به لاگینی که در پوشه ی ادمین قرار داره نمیتونه بره و redirect میشه به لاگین اعضا!
با این مشکل چی کار کنم؟!
یه سوال دیگه: ApplicationName رو در Web.config مینویسم ولی این Error رو میده:

Parser Error Message: Could not load type 'Arumss.ComTestAuthontication.MyRoleProvider'.

مهدی کرامتی
سه شنبه 10 شهریور 1388, 18:11 عصر
با روشی که براتون نوشتم نیاز نیست دو صفحه لاگین مجزا داشته باشید. همه کاربران می توانند با یک مکانیسم واحد لاگین شوند، اما اونهایی که نقش Administrator ندارند نمی توانند به فولدر Admin دسترسی داشته باشند.

m.hamidreza
سه شنبه 10 شهریور 1388, 18:34 عصر
و ادمین وقتی SiteName/admin رو تایپ میکنه به لاگینی که در پوشه ی ادمین قرار داره نمیتونه بره و redirect میشه به لاگین اعضا!
با این مشکل چی کار کنم؟!


با استفاده از تعریف location در وب کانفیگ مجوز دسترسی به صفحه ی لاگین ادمین رو به همه بدین.
موفق باشید.

liliyan87
پنج شنبه 12 شهریور 1388, 05:06 صبح
سلام یه سوال از آقای DelphiAssistant دارم خواستم ببینم آیا میشه کاری کرد که وقتی یه کاربر جدید میخوام عضو سایت بشه کاری کرد که تو نقش مربوطه قرار بگیره مثلا اگه سه نقش Admin , PowerAdmin, User وجود داشته باشه و بخوام کاربر جدید توی نقش user قرار بگیره؟

hamid1988
پنج شنبه 12 شهریور 1388, 13:25 عصر
سلام یه سوال از آقای DelphiAssistant دارم خواستم ببینم آیا میشه کاری کرد که وقتی یه کاربر جدید میخوام عضو سایت بشه کاری کرد که تو نقش مربوطه قرار بگیره مثلا اگه سه نقش Admin , PowerAdmin, User وجود داشته باشه و بخوام کاربر جدید توی نقش user قرار بگیره؟
جناب DelphiAssistant فرمودند که در جدول یک فیلد به نام UserType قرار بدیم و نقش کاربران را در آن مشخص کنیم، شما میتونید به هنگام ثبت نام کاربران UserType کاربر را بصورت پیش فرض Userقرار بدین!

احمد سامعی
جمعه 13 شهریور 1388, 00:05 صبح
با روشی که براتون نوشتم نیاز نیست دو صفحه لاگین مجزا داشته باشید. همه کاربران می توانند با یک مکانیسم واحد لاگین شوند، اما اونهایی که نقش Administrator ندارند نمی توانند به فولدر Admin دسترسی داشته باشند.

سلام استاد
منون از توضيحات
اما اگر از يك صفحه براي ورود استفاده كنيم و بخواهيم Admin وقت ورود مستقيم به صفحه مديريتي بره و كاربران به صفحه كه بودن يا پروفايل خودشون چه كار بكنيم ؟


با استفاده از تعریف location در وب کانفیگ مجوز دسترسی به صفحه ی لاگین ادمین رو به همه بدین.

مي شه بيشتر توضيح بدين ! (با نمونه كد...)

مهدی کرامتی
جمعه 13 شهریور 1388, 01:08 صبح
در صفحه لاگین پس از بررسی مجاز بودن کاربر تست کنید کاربر از چه نوعی است و سپس پس از مجاز کردن کاربر برای ورود به سیستم او را به صفحه مناسب هدایت کنید:
if(CheckIfUserIsInAdminTable(txtUsername.Text)
{
FormsAuthentication.SetAuthCookie(txtUsername.Text ,true);
Response.Redirect("~/Admin/Default.aspx");
}
else
{
FormsAuthentication.SetAuthCookie(txtUsername.Text ,true);
Response.Redirect("~/Default.aspx");
}

liliyan87
جمعه 13 شهریور 1388, 05:22 صبح
جناب DelphiAssistant فرمودند که در جدول یک فیلد به نام UserType قرار بدیم و نقش کاربران را در آن مشخص کنیم، شما میتونید به هنگام ثبت نام کاربران UserType کاربر را بصورت پیش فرض Userقرار بدین!

ولی من از عضویت خود asp.net استفاده کردم و فرم عضویت اینجور که شما میگی نیست اگه خودم بخوام جدول کاربران و طراحی کنم میدونم باید این کارو انجام بدم قبلا هم انجام دادم منظورم وقتی بود که از کنترل های خود Asp.net استفاده میشه.:متفکر:

مهدی کرامتی
جمعه 13 شهریور 1388, 05:42 صبح
فرقی نمی کنه که از کنترلی استفاده کنید. وقتی کلاس Role Manager خودتان را بعنوان مسئول مدیریت Role ها در پروژه معرفی می کنید این مکانیسم با استفاده از کنترل های خود ASP.NET هم کار خواهد کرد.

ممکن است مجبور شوید تعداد دیگری از متدهای کلاس MyRoleProvider را هم بنا بر نیازتان پیاده سازی کنید.

احمد سامعی
جمعه 13 شهریور 1388, 11:57 صبح
ولی من از عضویت خود asp‎.Net استفاده کردم ...:

ولي من فكر مي كنم در نهايت نبايد فرقي كند شما مي تونيد هنگام ايجاد كاربر جديد از كلاس AddRole هم براي اضافه كردن نقش استفاده كنيد همانطور كه از كنترل CreateUser از همين روش استفاده مي كنه

يك سوال استاد



Response.Redirect("~/Default.aspx");


من با اين متد مشكل دارم يعني درست اجرا نمي شه. ممكن از لوكال باشه من تو تاپيك زير هم پرسيدم اما به جواب نرسيد... لطفاً كمك كنيد.
چرا Response.Redirect بعد استفاده از باتن عمل نمي كنه ؟ (http://barnamenevis.org/forum/showthread.php?t=173003)
با تشكر

m.hamidreza
جمعه 13 شهریور 1388, 13:05 عصر
مي شه بيشتر توضيح بدين ! (با نمونه كد...)


<location path="WebAdmin/Index.aspx">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>

hamid1988
یک شنبه 15 شهریور 1388, 16:06 عصر
DelphiAssistant عزیز همه ی کارهایی را که گفته بودین در این پروژه انجام دادم اما بازم Error میده، لطفاَ راهنماییم کنید.
http://www.Hamidrahbar.com/temp/rols.rar
مرسی

مهدی کرامتی
چهارشنبه 18 شهریور 1388, 11:51 صبح
1- در صورت عدم دریافت پاسخ چند روز قبل از درخواست مجدد صبر کنید.

2- اشکال شما بخاطر غلط املایی در تعریف کلاس RoleProvider در Web.Config و ذکر NameSpace برای آن کلاس بود، در حالی که در تعریف کلاس NameSpace ای تعریف نکرده اید:
<add name="MyRoleProvider" type="Rols.MyRolProvider"/>
خط فوق در Web.Config شما میبایست این شکلی باشد:
<add name="MyRoleProvider" type="MyRoleProvider"/>

hamid1988
جمعه 27 شهریور 1388, 02:27 صبح
پروژه رو اصلاح کردم، دوستانی که تو بحث رول ها اشکال دارن میتونن از لینک زیر دانلود کنن!
http://www.Hamidrahbar.com/temp/rols.rar
DelphiAssistant، اگه ممکنه در مورد سایر متدهای کلاس MyRoleProvider نیز توضیح مختصری بدید، چه موقع از این متد ها استفاده می کنیم؟
مرسی