PDA

View Full Version : نحوه توزیع وب سرویس برای دیگر سایتها همراه با کد امنیتی



HadiGN
یک شنبه 10 مرداد 1389, 01:13 صبح
سلام
دوستان چه جوری واسه یه وب سرویس میشه کد امنیتی قرار داد؟ 4 ASP.NET
فرض کنید چندتا شرکت توی سایت من ثبت نام کردند که از این وب سرویس استفاده کنند
نام کاربری و رمز ورود هم به آنها ارسال شده ، برای وب سرویس (ویا کلا یه وب سایت) چه جوری میشه login ساخت؟
برخی گفتند باید از session استفاده کنی تا هر کاربر مجازی بتونه با داشتن نام کاربری و رمز عبور از توابع وب سرویس استفاده کنه
لطفا در مورد این قضیه هم منو راهنمایی کنید.
در صورتی که امکان داره از ضمیمه کردن نمونه برنامه در پایان توضیحات دریغ نکنید.
با تشکر

ricky22
یک شنبه 10 مرداد 1389, 07:52 صبح
Web Service Authentication (http://www.codeproject.com/KB/cpp/WebServiceAuthentication.aspx)

HadiGN
دوشنبه 11 مرداد 1389, 02:50 صبح
توی این لینک به متدهایی که تو وب سرویس هست
user , password
اضافه شده و با hashing امنیت وب سرویس بالاتر رفته اما نمیشه وقتی یک سایت دیگه میخواد از وب سرویس استفاده کنه لحظه ای که از سرویس یه شی میسازه (new میکنه) رمز بخواد؟

sia_2007
دوشنبه 11 مرداد 1389, 08:13 صبح
میتونی متدی رو که رمز رو دریافت میکنه و اعتبار سنجی میکنه رو به عنوان Initiator تعریف کنی؛ در نتیجه باید اول اون متد رو فراخونی کنه.
و اگه که نتونست از پس اعتبارسنجی بر بیآد؛ Seisson اش رو غیر فعال کنی.
تا مادامی که اون متد رو دوباره فراخونی کنه و دوباره اعتبارسنجی رو به صورت صحیح انجام بدی.

HadiGN
دوشنبه 11 مرداد 1389, 23:16 عصر
ببخشید میشه برای اینکه متدی رو به عنوان initiator تعریف کنیم چه کار باید کرد؟
نحوه غیرفعال کردن session رو هم توضیح میدید؟

mehdi.mousavi
سه شنبه 12 مرداد 1389, 00:42 صبح
سلام.
شما می تونید UID/PWD رو بصورت Inbound با هر Web Method به سرور ارسال کرده و اون سمت، بر اساس یک Security Token ای که فقط بار اول ساخته میشه و مدت زمان محدودی معتبر هستش، کاربر مورد نظر رو authenticate کنید. اینطوری دیگه نیازی به state-full بودن سرویس نیست و وب سرویس مورد نظرتون میتونه کاملا stateless باشه.

برای انجام اینکار، می تونید از استانداردهای WS-Security استفاده کنید. WSE اینکارو توسط Pipeline هایی که ایجاد کرده براحتی برای شما ممکنه میکنه...

احتمالا مایکروسافت در WCF، کلیه مشکلاتی که در WSE وجود داشت رو رفع کرده، اما متاسفانه چون با WCF آشنایی دقیقی ندارم، نمیتونم در موردش صحبت کنم. اما قبل از انجام هر کاری، ابتدا مطمئن بشید که WCF چگونه WS-Security رو آدرس کرده، چون اگر وب سرویس فربهی میخواهید بنویسید، نباید روی ASP.NET Web Services ها کارتون رو بنا کنید (نیازهای دنیای واقعی از قبیل Encrypt کردن پیامهای رد و بدل شده بین Client و Server (بخصوص بر اساس X.509 و ...)، انتقال Exception ها و ... در ASP.NET Web Services اگر غیر ممکن نباشه، بسیار دشوار هستش). بهتره از Framework ای استفاده کنید که برای کار شما مناسب هستش، احتمالا WCF یا (قطعا) WSE (http://msdn.microsoft.com/en-us/library/aa529139.aspx).

موفق باشید.

moharrami
سه شنبه 12 مرداد 1389, 00:47 صبح
میتونی از soap header استفاده کنی. در این روش کاربر برای استفاده از متد وب سرویس باید یه شیء header بهش اضافه کنه که میتونه username و password باشه و در هر متد چک کنی که معتبره یا نه. با یه جست و جو تو گوگل می تونی مثال هم پیدا کنی.

HadiGN
سه شنبه 12 مرداد 1389, 01:47 صبح
آقای محرمی در مورد soap header هم یه سوال داشتم اینکه با این کار کل متدهایی که این header رو دارن باید قبلا برای فراخوانی اونها username و password رو داده باشن؟ آخه سطح دسترسی متدها فرق داره بعضی متدها رو مدیر شرکت فقط اجازه داره استفاده کنه و بعضی از اونها رو سرویس دهنده ی اصلی (در سایت) با این کار رمز ورود برای هر دو دسته کاربران یکی خواهد بود؟

moharrami
سه شنبه 12 مرداد 1389, 10:44 صبح
نه به هیچ وجه.
هر کاربری با هر سطح دسترسی می تونه یه header درست کنه و یک متد رو فراخوانی کنه ولیکن ما در داخل متد میتونیم باتوجه به username و password وارد شده در header سطح دسترسی فراخوانی کننده را تشخیص بدیم و درصورت عدم اختیار سرویس مورد نظر رو بهش ندیم و مثلا یک کد خطا برگردونیم

mehdi.mousavi
سه شنبه 12 مرداد 1389, 23:12 عصر
ممنون راهنمایی های خوبی بود. آقای موسوی اگه میشه در مورد این فرآیند بیشتر توضیح بدید؟ "autheticate کردن کاربر"

سلام.
شما می تونید در WSE به سه طریق Client رو Authenticate کنید:


UsernameToken
X509SecurityToken
KerbrosToken

قاعدتا شما نیاز به UsernameToken دارید. در حقیقت، هدف قرار دادن Username/Password (یا هر اطلاعات دیگه ای) در SOAP Header درخواست هستش. بدین ترتیب، دیگه Formal Parameter های Web Method ها تغییر نخواهد کرد و شما با اجرای هر وب متود، میتونید ID/PWD مورد نظر رو بررسی کرده، در صورت امکان، درخواست مورد نظر رو اعمال کنید. اگر هم امکان اجرای متود (به هر دلیلی) وجود نداشت، میتونید خطا رو در SOAP Fault Element قرار بدید و به Client برگردونید. در لینکی که بهتون دادم، کلیه جزییات با Sample ارائه شده.

موفق باشید.

HadiGN
پنج شنبه 11 شهریور 1389, 03:58 صبح
سلام دوستان

بعد از اینکه تشخیص داده شد که با این username و password مجوز برای استفاده از method وجود ندارد، نحوه فرستادن خطا از وب سرویس به web application چی جوریه؟
آیا ارسال یک exception ساختگی (در وب سرویس) مجاز است؟
منظور از Soap fault element چیه؟

mehdi.mousavi
دوشنبه 15 شهریور 1389, 09:49 صبح
سلام دوستان بعد از اینکه تشخیص داده شد که با این username و password مجوز برای استفاده از method وجود ندارد، نحوه فرستادن خطا از وب سرویس به web application چی جوریه؟ آیا ارسال یک exception ساختگی (در وب سرویس) مجاز است؟
منظور از Soap fault element چیه؟

سلام.
SOAP Fault Element جایگاهی در پیامهای SOAP هستش که در اون می تونید پیامهای خطای مورد نیاز رو قرار بدید و به دست Client برسونید. یکی از این پیامها، میتونه (بقول شما) همون Exception ساختگی ای باشه که سمت وب سرویس ایجاد شده. این Fault Element ها، حاوی یک کد، پیام خطا، actor مربوطه و جزییات مربوطه به خطا میتونه باشه.

اما روش صحیح برای انجام اینکار چیه؟ ابتدا باید کلاسی بسازید و اونو از System.Web.Services.Protocols.SoapExtensionAttribu te مشتق کنید. بدین ترتیب Attribute جدیدی خواهید ساخت که کار شما رو در Web Service بسیار ساده خواهد کرد. از سوی دیگه، شما باید کلاسی بسازید و اونو از SoapExtension درایو کنید. توی این کلاس، و با override کردن متود ProcessMessage، شما باید اطلاعات مربوط به Exception رو Serialize کرده و در SOAP Fault Element قرار بدید.

سپس با استفاده از اون Attribute Class ای که ساختید، متودهای Web Service رو Decorate کنید و هر گونه پارامتری رو که مایل بودید به متود مربوطه پاس کنید. بطور نمونه، میتونید Context اجرایی Web Method رو با استفاده از این Attribute به کلاسی که از SoapExtenion مشتق کرده اید، ارسال کنید و اونجا، هنگام Serialize کردن اون Exception، از این اطلاعات اضافی نیز بهره بگیرید.

وقتی متود ProcessMessage رو override می کنید، این متود حاوی پارامتری از نوع SoapMessage هستش. SoapMessage حاوی یک Property به اسم Exception هستش که نشون دهنده Exception رخ داده در Web Method شماست.

تنها مساله ای که باید دقت کنید و بسیار حائز اهمیت هستش، فازی هستش که باید عمل Serialize/Deserilize کردن Exception در / از Soap Fault Element رو انجام بدید. در حقیقت، شما باید کلاس مزبور رو در یک Assembly جداگانه بنویسید، تا هم سمت Client و هم سمت Service اونو بتونید Reference کنید و ازش استفاده کنید.

ایده اصلی اینه که وقتی Exception ای در Web Method شما رخ داد، شما اون Exception رو سمت سرور در این Assembly و در متود ProcessMessage میگیرید، اطلاعاتش رو Serialize می کنید و در فاز SoapMessageStage.AfterSerialize اونو به SOAP Fault Element تزریق می کنید. در سمت Client، و در فاز SoapMessageStage.AfterDeserialize، شما میتونید بررسی کنید که آیا SOAP Fault Element در پیام دریافتی توسط Client وجود داره یا خیر، و اگر وجود داشت، اونو به یک کلاس Exception، خودتون، Deserialize کنید.

بدین ترتیب Exception مورد نظر شما روی خط منتقل میشه، و شما میتونید از اون هر استفاده ای خواستید بکنید.

موفق باشید.

HadiGN
سه شنبه 16 شهریور 1389, 02:30 صبح
تشکر!
یه چیزایی فهمیدم
اگه میشه برای درک بیشتر نمونه کد بدید
یا اینکه لینکی از اینترنت که کد WebService ای رو داشته باشه که کد فرستادن یک exception رو (با رعایت این جزییات مهم) نوشته باشه
البته خودم تو اینترنت search کردم یه چیزایی گرفتم اما یه جوری بود!!! :متفکر:
خیلی ممنون

xamfia
چهارشنبه 24 شهریور 1389, 08:36 صبح
بستگی به کاری که قرار است انجام دهید هم داره.به طور مثال برای B2B گواهینامه های امنیتی(Certificate X.509) کاربرد داره و برای B2C هم User/Pass اما اگر قرار امنیت سرویس فقط در یک دامین خاص باشد معماری کربروس میتواند گزینه مناسب تری باشد.