مصادقة المستخدم / تمرير باستخدام نماذج WCF و Windows مريحة

StackOverflow https://stackoverflow.com/questions/395892

سؤال

ما هو أفضل نهج لتنفيذ الترخيص / المصادقة للحصول على تطبيق نماذج Windows يتحدث إلى خدمة WCF المريحة المستضافة IIS؟

السبب في أنني أسأل هو أنني مرتبك للغاية، بعد انحياز من خلال المقالات والمشاركات المختلفة التي تعبر عن طريقة مختلفة وتضرب في نهاية المطاف وثيقة صفحة ~ 650 على أفضل الممارسات للأمن WCF "(http://www.codeplex.com/wcfsecurityguide.) أنا فقط غير مؤكد الطريقة التي هي الأفضل أن تأخذ وكيفية البدء في التنفيذ، بالنظر إلى سيناريو.

لقد بدأت مع هذه المقالة "دليل لتصميم وبناء خدمات الويب المريحة مع WCF 3.5" (http://msdn.microsoft.com/en-us/library/dd203052.aspx.) وفيديو PDC على خدمات WCF مريحة، التي كانت رائعة وساعدني في تنفيذ أول خدمة WCF الصديقة الأولى،

بعد أن أدت الخدمة، عدت إلى تنفيذ الأمن، انظر. "اعتبارات أمنية" (الربع أسفل الصفحة) ومحاولة تنفيذ رأس تفويض HTTP وفقا للتعليمات، ومع ذلك، وجدت التعليمات البرمجية غير مكتملة (انظر كيفية إعلان متغير "userkeys" أبدا). هذه هي النقطة التي حاولت فيها البحث عن المزيد حول كيفية القيام بذلك (باستخدام HMAC Hash مع رأس HTTP "إذن"، ولكن لا يمكن العثور على الكثير على Google؟) قادني إلى مقالات أخرى فيما يتعلق بأمان على مستوى الرسائل، يشكل مصادقة المصادقة والمصلح المخصص وبصراحة أنا لست متأكدا من الطريقة الأفضل والأكثر ملاءمة في اتخاذها الآن.

لذلك مع كل ما قال (وشكرا للاستماع حتى الآن!)، أعتقد أن أسئلتي الرئيسية هي،

- ما تنفيذ الأمن الذي يجب أن أستخدمه؟

- هل هناك أي طريقة لتجنب إرسال اسم المستخدم / كلمة المرور مع كل مكالمة WCF؟ أفضل أنني لا أرسل هذه البايتات الإضافية إذا تم إنشاء اتصال في البداية، والذي سيكون قبل السماح بإجراء مكالمات لاحقة بعد تسجيل الدخول.

- هل يجب أن أكون قلقا حقا إزاء أي شيء آخر غير النص العادي إذا كنت أستخدم SSL؟

كما قال، .NET 3.5 Win Forms App، خدمة WCF المستضافة IIS، ولكن ما هو مهم، أتمنى أن تتطلب أي خدمات WCF جميع إجراءات التفويض هذا (ومع ذلك، يجب أن تكون، جلسة، رأس HTTP أو غير ذلك) كما أنا لا تريد أن يكون أي شخص قادرا على ضرب هذه الخدمات من الويب.

أعلم أن النشر أعلاه كبير ولكن اضطررت للتعبير عن الطريق الذي كنت قد انخفض بالفعل وما أحتاجه لإنجازه وأي جميع المساعدة موضع تقدير كبير.

ملاحظة: أنا أدرك أيضا هذا المنصب كيفية تكوين خدمات مريحة آمنة مع WCF باستخدام اسم المستخدم / كلمة المرور + SSL وإذا اقترح المجتمع أنني ابتعد عن الراحة لخدمات WCF، يمكنني القيام بذلك، ومع ذلك بدأت مع هذا للحفاظ على الاتساق لأي برام بردية عامة قادمة.

أعتقد أنه من المهم أن أذكر كيف يمكنني الوصول إلى خدمة WCF الخاصة بي (الاتصال بالخدمة تعمل، ولكن ما هي أفضل طريقة للتحقق من صحة بيانات الاعتماد - ثم إرجاع كائن العضو؟):

WebChannelFactory<IMemberService> cf = new WebChannelFactory<IMemberService>(
                new Uri(Properties.Settings.Default.MemberServiceEndpoint));
            IMemberService channel = cf.CreateChannel();
            Member m = channel.GetMember("user", "pass");

التعليمات البرمجية التي تم تنفيذها من مقالة MS (وبعضها للاختبار):

 public Member GetMember(string username, string password)
    {
        if (string.IsNullOrEmpty(username))
            throw new WebProtocolException(HttpStatusCode.BadRequest, "Username must be provided.", null);
        if (string.IsNullOrEmpty(password))
            throw new WebProtocolException(HttpStatusCode.BadRequest, "Password must be provided.", null);

        if (!AuthenticateMember(username))
        {
            WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
            return null;
        }

        return new Member() { Username = "goneale" };
    }
هل كانت مفيدة؟

المحلول

حسنا، ليس لدي أي خبرة مع قدرات الباقي من WCF، لكنني قمت بالتصارع كثيرا بفهم الآثار المترتبة على خيارات الأمن في سؤال أمان WCF الخاص بي. وبعد كما لاحظت، هناك نقص حقيقي في الوثائق على شبكة WCF الخاصة بهم على شبكة الإنترنت، وتجربة الباقي محدودة، لذلك خذ إجاباتي بحببة الملح:

ما تنفيذ الأمن الذي يجب أن أستخدمه؟

و

هل يجب أن أكون قلقا حقا إزاء أي شيء آخر غير النص العادي إذا كنت أستخدم SSL؟

المصادقة الأساسية على SSL على ما يرام - بعد كل شيء، هذا مدى قدر كبير من مواقع الويب الحالية المصادقة للمستخدمين. (عند تسجيل الدخول إلى حساب التسوق Amazon الخاص بك، فإنهم مجرد نقل اسم المستخدم وكلمة المرور الخاصة بك كما كتبته عبر اتصال SSL.) أفهم ما تقوله المقالة حول هجمات الأمان والقاموس، ولكن بلاه بلاه بلاه، تبقيه بسيطا واحصل على شيء يعمل أولا. يسأل API Wiss Old Old XML Old.ame وكلمة المرور مع كل مكالمة، لذا فإن تطبيقات برامج API لسور فيديكس، لذا فإن API SOAP PayPal's Soap API والصابون الساريبرسورسي - يبدو أن هذا جيد بما يكفي لاستخدام العالم الحقيقي.

هل هناك أي طريقة لتجنب إرسال اسم المستخدم / كلمة المرور مع كل مكالمة WCF؟ أفضل أنني لا أرسل هذه البايتات الإضافية إذا تم إنشاء اتصال في البداية، والذي سيكون قبل السماح بإجراء مكالمات لاحقة بعد تسجيل الدخول.

هذا هو الشخص الذي يمكنني الإجابة عنه بثقة قليلا. عادة ما نحاول تصميم خدمات WCF المواجهة العامة الخاصة بنا لتكون عديمة الجنسية. بهذه الطريقة، حجم خدمات WCF لدينا بسهولة؛ فقط رمي المزيد من الأجهزة والمزيد من الخوادم وتحميل الموازنين في المشكلة، ولا داعي للقلق بشأن الجلسات اللاصقة أو الحفاظ على حالة جلسة في مكان ما. بحيثما يعني أنه إذا كنا نريد "الاحتفاظ بمستخدم المستخدم"، فهذا ليس شيئا سيحدث على الخادم.

ما انتهى بي الأمر هو علاج موقع الويب الخاص بي كأنظمة فرعية موثوق بها. مصادقة مقابل خدمة WCF باستخدام شهادة X509 مشتركة مسبقا، وإذا تم تسجيل عميل في موقع الويب عبر مصادقة النماذج، فسوف يرسل رأس اسم مستخدم عميل إلى الخدمة؛ ستبحث سلوك نقطة النهاية المخصصة في خدمة WCF عن هذا الرأس، وانظر إلى أنه تم تثبيته بواسطة نظام فرعي موثوق به، ثم انتقل إلى انتحال شخصية هذا المستخدم بدون كلمة مرور المستخدم التي تحتاج إلى توفيرها أو التحقق منها مقابل قاعدة البيانات.

نظرا لأنك تستخدم الراحة، فربما يمكنك استخدام ملف تعريف الارتباط على جانب العميل للحفاظ على الحالة. إذا كنت تستخدم وضع توافق ASP.NET، أعتقد أنه يمكنك استخدام مصادقة النماذج مباشرة، لكنني لا أعرف الكثير عن هذا النهج لأن خدمة WCF لم تكن مستضافة من IIS.

باختصار، رغم ذلك، سوف تضطر إلى إرسال شيئا ما مع كل طلب لتحديد المستخدم، ما إذا كان هذا هو اسم المستخدم وكلمة المرور، فقط اسم المستخدم، أو بعض القيمة المهاجمة المخزنة في ملف تعريف الارتباط. إذا كان الخيار الأخير، أعتقد أنك يجب أن يكون لديك نوع من Login() الطريقة أو شيء ما في الخدمة، شيء من شأنه أن يرسل "حسنا، لقد قمت بتسجيل الدخول إذا مررت في قيمة التجزئة هذه مع الطلبات المستقبلية". ولكن ليس كل العملاء الراحة سيتوقعون تلقي ملفات تعريف الارتباط، فقط الحصول على طلبات / وضع / حذف / حذف / حذف بسيطة فقط دون أي دولة.

إذا كانت تلك حذائي، فستتوجه إلى نهج النظام الفرعي الموثوق به (حيث يتم توفير رأس اسم المستخدم مع بيانات اعتماد مشتركة مسبقا النظام الفرعي) أو سأطلب مصادقة على كل مكالمة. من المحتمل أن تحصل الخدمة على بعض آلية التخزين المؤقتة المصادقة عالية الأداء إذا أصبحت كل تلك الطلبات المتكررة مشكلة.

امل ان يساعدك ذلك قليلا.

نصائح أخرى

باستخدام المصادقة الأساسية:

WebHttpBinding binding = new WebHttpBinding();
binding.SendTimeout = TimeSpan.FromSeconds(25);
binding.Security.Mode = WebHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

Uri address = new Uri("http://localhost:3525/WcfRestWeb/Quotes.svc");

WebChannelFactory<IQuoteService> factory =
             new WebChannelFactory<IQuoteService>(binding, address);

factory.Credentials.UserName.UserName = "tan";
factory.Credentials.UserName.Password = "wani";

IQuoteService proxy = factory.CreateChannel();

var response = proxy.GenerateQuote(GetQuoteRequest());
Console.WriteLine("Quote Amount: " + response.QuoteAmount);

شكرا على الإجابات. يخطو مرة أخرى وتبحث بوضوح وغير متحيز في المشكلة ككل (بمعنى آخر يتجاهل ساعات 4+ مستثمرة بحثا عن خدمات مريحة) أحاول الحصول على الشيء الذي يعمل دون راحة في الوقت الحالي والمراجع التي أحاول أن أتابعها هذه اللحظة: -

هذا يبدو قابل للتطبيق على ما أريد.

LextM: أسمعك في هذا الأمر، بعد أن كتبت المنصب الذي قمت بمسح البحث من خلال دليل أمان WCF وتقديم ملاحظات على جميع متطلباتي بناء على الخيارات المعينة التي يريدون منك التفكير فيها على كل تينيت.

لقد اخترت:
- نقل وضع الأمان: أمن النقل
- مصادقة. الخيار: الأمن الأساسي
- ملزمة: Wshttpgbinding
- مصادقة مخصصة مع مسح اسم المستخدم

في ضوء الأمثلة المقدمة لكل منها وتبحث في حالة استخدام نماذج Windows W / WCF، يبدو أن أفضل طريقة للذهاب.

نيكولاس: اتفقا، تصميم الخدمات التي يجب أن تكون عديمة الجنسية ربما يكون نهجا أفضل.

بناء على المقال، سأتابع عندما أحصل على وقت، فإنه يستخدم مركز X509. التي أنا جديد جدا من جديد (فهمك تستخدم هذا النيتشولاس هذا) هل سيكون هذا جيدا نظرا لإمكانية تنزيل تطبيق العميل هذا من الإنترنت وتثبيته على جهاز الكمبيوتر الشخصي الذي يحتوي على حساب مع موقع الويب الخاص بي؟

هتافات لجميع مساعدتكم، غراهام

ملاحظة: أعتقد أن هذا هو أقرب حالة استخدام إلى سيناريو (ما عدا أرغب في استخدام أمن النقل)، هل يجب أن أفكر في تنفيذ هذا لأنه لا يهتم بملك؟ من الاقتباس قرأت أنني قد أحتاج إلى سيرت. نظرا لأن "تشفير الشهادة X509 مطلوبة بواسطة WCF لأن بيانات اعتماد العميل (اسم المستخدم / كلمة المرور) يتم تمريرها كنص واضح في رسالة الصابون." - لكن من ما تعلمته وما قلناه، إذا كنت أستخدم SSL، فمن المحتمل أن تكون هذه النقطة موضعية ...

حسنا، يجب أن لا تدفع الكثير من الاهتمام إلى جانب WinForms لأن الجانب WCF هو المفتاح.

بالمناسبة، هل قرأت هذه الصفحات بعناية؟

مفهومhttp://www.codeplex.com/wcfsecurityguide/wiki/view.aspx؟title=ch٪2005٪20-٪20Authentication ،٪20 مواضيعي

وكيفhttp://www.codeplex.com/wcfsecurity/wiki/view.aspx؟title=how٪20tos&referringtitle=home.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top