# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > Silverlight > سوال: چگونه اعتبار سنجی کنیم؟

## mostafarastin239

سلام
لطفا چگونگی اعتبار سنجی نام کاربری و رمز عبور برای وارد شدن به سایت را شرح دهید. در همین جا بحث کنید و به صفحات دیگر ارجاء ندهید.
با تشکر

----------


## taghvajou

سلام به همه
جناب راستین! میشه سوالتون رو دقیق تر بپرسین که کجای کار مشکل دارین؟
ساده ترین روش:
روال برای لوگین (به قول شما اعتبارسنجی) اینکه که طی یه تابع بنویسین و پارامتر ورودی این تابع نام کاربری باشه! وظیفه این تابع اینه که بره از دیتابیس و یه کوئری بکشه و پس ورد این نام کاربری رو دربیاره! اگه پسوردی وجود نداشت یعنی چنین نام کاربری وجود نداره و مقدار خالی برمیگردونه!
حالا مقدار بازگشتی تابع رو با مقدار وارد شده در باکس رمز مقایسه کنین و ...

روش درستر:
یه تابعی بنویسین که دوتا ورودی نام کاربری و رمزغبور بگیره و یه فلگ مثل بول یا اینت برگردونه.
این تابع بعد از کوئری از دیتابیس اگه رمز تطبیق بکنه با اونچه کاربر وارد کرده، مقدار فلک رو درست یا یک میکنه وگرنه نادرست یا صفر میکنه و برمیگردنه! کلاینت ساید هم شما بعد از گرفتن مقدار بازگشت داده شده، یا وارد سایت میکنینش ویا پیغام مناسب رو به کار نشون میدین!

دقیق تر بپرسین که نقطه ابهام کجاست؟

----------


## mostafarastin239

سلام
فکر کنم روش دوم اصولی تر باشه. لطف می کنید با کد توضیح بدید.
با تشکر

----------


## shgroup

سلام
دوست عزیز توضیح جناب تقوی جو رو کامل کنم با یه نکته
اگه طراحی سایت کرده باشید یکی از دقدقه های طراحان اینه که چطوری چک کنند کاربر وارد شده یا خیر و اینکه اگه کاربری وارد نشده بود نتونه به فرمهایی مانند صفحات ادمین و ... دسترسی داشته باشه و کلا Authentication که روشهای زیادی برای این کار وجود داره اما کدوم روش اصولی تره مهمه.
خوبیه روش دومی که جناب تقوی جو توضیح دادند اینه که میشه با این روش این کار رو انجام داد و زمانی که کاربر از سیستم خارج میشه این فلک یا مقدار صفر و یک را تغییر داد و در زمان باز شده هر صفحه به راحتی چک کنیم که کاربر وارد شده یا نه...
البته یکی از دوستان ما یه روشی رو برای ورود ابداء (اختراع)  :لبخند:  کرده که برای جلوگیری از حملات Injection و غیره یک دستور العمل خاصی را انجام میداد یعنی اونطور که خودش می گفت میومد زمانی که کاربری یوزرنیم و پسوردش رو وارد می کرد یک data table ایجاد می کرد و اون رو از تنها اطلاعات کاربری که می خواهد وارد شود پر می کرد (البته بعد از چک کردن اینکه درست است یا خیر) و بعد در این دیتاتیبل رو password رو چک می کرد و در صورت درست بودن...
خودش که توضیح می داد در مورد مزیت این روش میگفت دیکه بازدید کننده سایت که ممکنه یه هکر حرفه ای هم باشه برای ورود دیگه به خود دیتابیس  و تیبل کاربران که همه کاربران در آن هستند دسترسی نداره و در حقیقت این دیتاتیبل بین دیتابیس و سطح کاربر وجود داره
جناب تقوی جو ببینید این روش به نظرت چطوریه ؟ آیا میشه پیاده سازی کرد ؟  :متفکر:

----------


## sia_2007

اگه Host ما که ASP.Net هست؛ داخلش Authentication پیاده سازی شده باشه؛ ما میتونیم یه Credential بسازیم و بفرستیم سمت سرور
این رو Reuseability میگه

----------


## taghvajou

سلام به همه و التماس دعا در روز دوم ماه مبارک
خدمت *داش سیا 2007* عارضم که تو سیلورلایت نمیشه کنترل آتونتیکیشن ای اس پی استفاده کرد! یعنی کنترلهای لوگین رو نداره! پس این روش برای سیلورلایت هیچ!

ایمان جان! از اینجکشن نترس! چون از سرویس استفاده میشه! واکشی که مستقیما از دیتابیس انجام نمیشه! متد واکشی موجود تو وب سرویس wcf نوشته شده به کار گرفته میشه!

----------


## mostafarastin239

سلام
از هر چه بگذریم سخن دوست(مهندس تقوی جو) خوش تر است. خوب مهندس تقوی جو برو سر اصل مطلب و از حاشیه دور شو تا مثل تیم های ملی ایران ... نشوی.
با تشکر

----------


## sia_2007

ما کنترل ASP.NET رو توی Silverlight نمیگذاریم
بلکه از Credential استفاده میکنیم.
دوره Networking Silverlight 4 Beta ی آقای تلویی رو نگاه بفرمایید.

----------


## taghvajou

ممنون! میشه آدرس هم بدین؟

----------


## meysam_pro

> سلام
> دوست عزیز توضیح جناب تقوی جو رو کامل کنم با یه نکته..
> البته یکی از دوستان ما یه روشی رو برای ورود ابداء (اختراع) ....


هر دو روش مشکل sniffing دارن و توصیه نمیشن.(البته کوچکترین ایرادشونه)
بهترین روش استفاده از WebContext.Current.User.IsInRole هستش.
برای اطلاعات بیشتر به اینجا مراجعه کنید.

----------


## taghvajou

سلام به همه و طاعات و عبادات قبول
از آقای میثم_حرفه ای ممنون که با اشاره به آتونتیکیشن سرویس ما رو راهنمایی کرد که مطالعه کنیم و چیزی جدید یاد بگیریم. از ته دل دستتون درد نکنه و براتون دعا می کنیم.

با توجه به اهمیت و جذابیت تذکرتون:
ولی در مورد اسنیفینگ، سه چهار روش گشتم و پیدا کردم، امتحان کردم ولی گفته شما صدق نکرد. 
گویا با توجه به اینکه تابع ما تو وب سرویس اجرا میشه، اطلاعات داخل وب سرویس سوپ و سریال میشه!
البته با فرض مفهوم اسنیفینگ که من خوندم و سر در آوردم یعنی تصویر زیر:
http://www.linewbie.com/upload/linew...s/ettercap.gif

مممنووووووون میشم. دقیقا بگین! قوربون دستت! بزن در رو نکن!

----------


## sia_2007

چون اطلاعات از طریق basicHTTPBinding ارسال میشه که به معنی ارسال به صورت Text هستش؛
اسنیف کردن امری بسیار ساده و بدیهیه.
پس استفاده از متدهای داخل Web Service کاملا بی فایده هستش؛ مگه این که از رمز نگاری استفاده کنیم.

در ضمن فکر نمیکنید منطقی ترین روش استفاده از خود ASP.Net Auth باشه ؟
1- دوباره کد نمیزنیم
2- با *Refresh* شدن صفحه؛ دوباره مجبور به Auth کردن تو Silverlight نیستیم.
و اگه بخواهیم Auth شدن رو تو مثلا Isolated Storage ذخیره کنیم؛ خطرات خاص خودش رو داره.
3- اون همه Role ای رو که درست کردیم رو دوباره مجبور نیستیم پیاده سازی کنیم
4- کاربر مجبور نیست که هم تو ASP.Net ؛ لاگین کنه و هم تو Silverlight

با توجه به لینکی که دوستمون دادند؛ دیگه نیاز به فیلم نیست؛ تا موجب دوباره کاری و یا سردرگمی دوستان نشه.

----------


## meysam_pro

اینکه بگی هیچ راهی واسه یک کار وجور نداره، خیلی *سختر* از اینه که بگی حداقل یک راه وجود داره!
در چند مرحله و چند جا میشه این کار رو کرد، اگه خوده SOAP یک SoapHeader واسه Authentication نداشته باشه که خودش یک Vulnerability هستش!
جدای از اون ، وقتی داده رو به وب سرویس میفرستی، گذرواژه (!) شما به صورت Plain منتقل میشه که با یک Packet Analyzer به سادگی میشه داده رو در آورد.(MD5 در سیلورلایت NameSpace مربوط به System.Security.Cryptography وجود نداره و نمیشه پسورد رو Hash کرد).

----------


## taghvajou

مجددا سلام به همه و به این دو بزرگوار که تو بحث همراهی میکنند.

عمرا من (دور از محضر دوستان) چنین شکری خورده باشم که بگم هیچ راهی نیست! به قول شما همیشه هکرها دمشون گرمه!

از اینکه با دقت بحث رو هم دنبال میکنین ممنونم و خواهش میکنم ادامه هم بدیم. خوشحالم که به یه بحث حرفه ای تبدیل شده!
هرچند بنده خدا مصطفی واقعا چیزی که دنبالش بود، واسه شروع کردن بود! شاید یه چیزی تو مایه های همون تابع های اولی که بنده گفتم! 

بریم سراغ بحث خودمون:

اول یه سوال که یاد بگیریم:
اون پاکت آنالایزر رو کجا و کی به کار ببریم که بشه دید محتوای پاکت ارسالی رو؟ اگه دارین یه نمونه بدین یا بگین؟ ممنون

اما در مورد جواب داش میثم: 
والله اینکه میفرمایین اون نیم اسپیس وجود نداره، باید تصحیح کنم هست! من خودم از کلاس HMACSHA256 اون نیم اسپیس واسه هش کردن استفاده کردم و میکنم.

*واسه موقع ارسال* رمز که خوب هش میکنیم! 
*واسه موقع پاسخ* اگه تو تعریف کلاس ماهیتمون هم از DataContract استفاده بشه، تمامی اطلاعات (*تمامی اطلاعات*)سریالایز میشه!
وانگهی وجود هدر تو آتونتیکیت سوپ هیچ کلیدی به هکر نمیده! چرا که در پاسخ تابع لوگین ما فقط یه فلگ بی ارزش برگردوندیم که دی سریالایز کردنش ارزشی نداره!

اما اینکه سیا میگه:
*رفرش:* با توجه به اجرای خارج از مرورگر سیلورلایت دیگه رفرش نگران کننده نیست.
*کد زدن:* اینجا حق باشماست. ولی آتونتیکیت اونقدر منعطف نیست که ما بتونیم توش هر کاری بکنیم (البته تا جایی که من بلدم و مطالعه کردم و مشتاق هستم در این باره بیشتر بدونم که تا چه حدی میشه کاستومایز کرد.)
*رول:* به لحاظ حجم کاری فرقی نمیکنه که برای ست کردن گرانت ها و دسترسی های یک رول در هر دو روش ( اگه میکنه لطفا توضیح بدین).
*لوگین:* حق با شماست.
من در مورد ذخیره مجزا (Isolated Storage) هنوز برخوردی نداشتم و اطلاعاتی ندارم. ممنون میشم بگین تا یاد بگیریم.

امیدوارم که این سوال و جواب ها، حمل بر ادبی و جدل نباشه! هدف یاد گرفتن و مباحثه علمیه!

----------


## mostafarastin239

> مجددا سلام به همه و به این دو بزرگوار که تو بحث همراهی میکنند.
> 
> عمرا من (دور از محضر دوستان) چنین شکری خورده باشم که بگم هیچ راهی نیست! به قول شما همیشه هکرها دمشون گرمه!
> 
> از اینکه با دقت بحث رو هم دنبال میکنین ممنونم و خواهش میکنم ادامه هم بدیم. خوشحالم که به یه بحث حرفه ای تبدیل شده!
> *هرچند بنده خدا مصطفی* واقعا چیزی که دنبالش بود، واسه شروع کردن بود! شاید یه چیزی تو مایه های همون تابع های اولی که بنده گفتم! 
> 
> بریم سراغ بحث خودمون:
> 
> ...


سلام
 :قهقهه:  :قهقهه: *من به عنوان ایجاد کننده ی تاپیک اعتراض دارم آقا، اعتراض دارم (جدی نگیرید)* :قهقهه:  :قهقهه: 
اگر یکی از شما دوستان حرفه ای به من مبتدی یک جواب هر چند ساده با چند خط کد که کار بکنه بدهید من هم قول می دهم دیگر اعتراض نداشته باشم و در مواردی حتی با سوال های ساده ولی زیاد شما عزیزان را خسته کنم و به عبارتی در بازی شما من هم دخیل شوم.
با تشکر

----------


## sia_2007

نکته این جاست که ما همیشه Out of Browser نیستیم
مگه این که طرف رو هم مجبور به نصب کنیم و هم مجبور به استفاده از Out of Browser !
دوما؛ در سیستم شما در حالی که طرف از ASP.Net Form ؛ خارج شده؛ و Logout کرده؛ کماکان در سیستم شما (سیلورلایت ) لاگین هستش.
و مجبوره که از Silverlight هم به صورت مجزا Logout کنه.
در حالی که میشه موقع Logout در ASP.Net یک پیغام به Silverlight بفرستیم تا او هم خارج شود.
در مورد Role حرفی که شما زدید درسته؛ ولی جواب بحث من نیست.
شما اگر Role رو بخواهید؛ باید دوبار اون رو پیاده سازی کنید؛ یکی تو ASP.Net و یکی تو Silverlight
در حالی که در سیستم مورد نظر من؛ پیاده سازی Role ها یک بار و در ASP.Net استفاده میشه.
و تغییر در اون فقط برای سمت ASP.Net لازمه؛ در حالی که شما دو طرف رو تغییر میدهید.
به هرحال ممکنه طرف برنامه شما رو ببنده؛ در اون صورت شما بعد از باز کردن مجدد برنامه میخواهید باز هم Auth کنید؛ در حالی که طرف در ASP.Net هنوز Auth هست ؟
HOTMAIL داره برای Upload کردن Document ؛ از Silverlight و Drag & Drop اون استفاده میکنه.
اگه با روش ساده مورد نظر شما کار کرده بود؛ Auth کردن پی در پی؛ Log Out پی در پی ؛ و کد زدن اظافه و مدیرسیت سخت تر کار رو داشت؛ اما با این روش استاندارد و راحت ؛ دیگه هیچ مشکلی پیش نمیآد.
به عبارت دیگه؛ اول من باید به Mail خودم لاگین میکردم
بعد به برنامه Silverlight
و بعد اگه وسط کار صفحه Refresh میشد؛ من دوباره باید به سیلورلایت Login میکردم.
یا این که برنامه رو به صورت OOB اجرا میکردم
و بعد موقع خروج اول از Silverlight خارج مشدم و بعد از ASP.Net !

در حالی که الآن فقط یک بار Login و Logout میکنم.

----------


## taghvajou

حرفهای آخر رو کلا قبول دارم! مثالتون هم کاملا درست و معقوله! یه سر به این آدرس بزن: http://dorm.tabrizu.ac.ir
به نظر من دیگه اینجا نیازی نبود که از ای اس پی استفاده بشه! لوگین مستقیما با سیلور

در مورد انعطاف یا عدم انعطاف *کافی* آتونتیکیشن و کاستومایز کردن اون لطفا بیشتر بگین! و توضیح در مورد ذخیره مجزا و خطرات احتمالیش. ممنون

----------


## sia_2007

سایت جالبیه
من منظورتون رو در مورد انعطاف Auth نمیفهمم.
آیا منظورتون Auth خود ASP.Net هستش؛ در این صورت آره انعطاف پذیره و کار رو راه میاندازه.
اما در کل ASP.Net Auth چیزی فراتر خود کنترلها و ابزارهاش هستش؛ که جای بحثش این جا نیست.
----
بحث دوم هم بحث جدی نیست؛ اگه شما نخواهید موقع Refresh شدن صفحه از نوع Auth کنید؛ باید Auth بودنش رو جایی ذخیره کنین مثل ISO Storage ؛ البته من تست نکردم, منظور من کلیه.
----

----------


## meysam_pro

> اما در مورد جواب داش میثم:
> والله اینکه میفرمایین اون نیم اسپیس وجود نداره، باید تصحیح کنم هست! من خودم از کلاس HMACSHA256 اون نیم اسپیس واسه هش کردن استفاده کردم و میکنم.


اشتباه تایپی شده بود که اصلاح کردم. منظورم MD5 بود که گویا یک پیاده سازی هم جدیدا ازش شده.




> واسه موقع ارسال رمز که خوب هش میکنیم!


خب OK، حافظه رو چی کار میکنی؟[بر خلاف WPF کنترل PasswordBox داده های ورودی رو Hash نمیکنه!]




> واسه موقع پاسخ اگه تو تعریف کلاس ماهیتمون هم از DataContract استفاده بشه، تمامی اطلاعات (تمامی اطلاعات)سریالایز میشه!


مطمئنی؟   :متعجب: 




> اون پاکت آنالایزر رو ..........


به تالار امنیت سری بزنید.(البته فکر نمیکنم کسی در این مورد اطلاعاتی بده)

[بقیه بحث خوب پیش رفته.(یاخچیدی)]

----------


## mostafarastin239

سلام مهندس تقوی جو،
از نظر من بحث دیگه کافیه و باید با کد نویسی بچه ها را راهنمایی کرد تا مثل من ... نشوند. :لبخند گشاده!:  :لبخند گشاده!: 
 نظر شما چیه!!!؟؟؟ :متفکر:  :متفکر:

----------

