משיב מוביל
WCF & F5 Load Balancer problem

שאלה
-
My desired working scenario is:
* Client sends https requests to the WCF server through F5 Load balancer
* F5 Load balancer decrypt the request
* WCF server process the http message
* WCF server replies back to the client (http)
* F5 Load balancer encrypt the request back to https
My problem is that WCF service expects HTTPS messages and gets HTTP messages instead, as a result the WCF service decline all messages.
I've tried a work around - create a custom HttpTransportBindingElement that can return security capabilities indicating transfer protection is present (even though it is not). This solution only partly worked, because the request was approved by the WCF service, but the client rejected the reply on - "The username is not provided. Specify username in ClientCredentials". I will be glad to hear if anyone encountered this problem and have any kind of solution?
Thanks in advanced for the help!
תשובות
-
הי.
מה שאתה מדבר עליו נקרא ssl offloading. כאשר מבצעים ssl offloading לפני WCF, למעשה WCF לא יודע שהוא secured ולכן אין צורך לשים אותו SSL.
מה שצריך לעשות זה את הפעולות הבאות:
1. להגדיר את ה-binding ללא security.
2. עבור metadata - להגדיר את ה-address של ה-endpoint עם https, אבל להוסיף ל-endpoint מאפיין listenUri שאומר לו לאיזו כתובת אמיתית להאזין. זה יאפשר האזנה על http אבל לרשום את הכתובת במטאדאטה כ-https
3. על מחלקת השירות לשים את ה-attribute של ServiceBehavior ולכוון את ה-AddressFilterMode ל-Any - זה יאפשר לשירות לקבל בקשה ל-http למרות שכתוב לו https.
כמובן שזה אומר שבין ה-f5 ל-WCF השירות לא מאובטח, וכן אינו דורש הזדהות. אם אתה צריך להזדהות מול השירות זה עוד כמה הגדרות שצריך לעשות.
Please mark posts as answers/helpful if it answers your question.
Senior Consultant on WCF, ASP.NET, Siverlight, and Entity Framework. Author of Microsoft's Official WCF 4 Course. Co-author of the Microsoft HPC/Azure burst whitepaper.
Visit my blog: http://blogs.microsoft.co.il/blogs/idof- הוצע כתשובה על-ידי Ido Flatow. _Moderator יום שלישי 31 ינואר 2012 09:52
- סומן כתשובה על-ידי pituachMVP, Moderator יום רביעי 16 אוקטובר 2013 10:44
כל התגובות
-
יניב שלום
1. דווקא WCF מאפשר עבודה ישירה עם HTTPS ובכלל הוא דיי גמיש מבחינת עבודה בפרוטוקולים שונים (בניגוד ל WS) כך שאני לא מבין בדיוק את הבעיה שאתה מציג. אם תוכל לצרף פרוייקט מינימלי קטן לדוגמה ולפרט שוב את הבעיה אולי יההי יותר מובן
2. אתה מדבר על הודעות שגיאה אבל לא מציג לנו כלום אלא רק מנסה להסביר במילים שלך. ייתכן מאוד שדווקא "השפה" של הודעוצת השגיאה המובנות יותר ברורה לאנשים שכבר נתקלו בכך. נסה לצרף מעט צילומי מסך והודעת שגיאה מדוייקת ומלאה
*** אם אתה רוצה לעקוף את הבעיה אז אני יכול להציע משהו שפעם ביצעתי ב WS עוד לפני ה WCF כשלא יכולתי להישתמש ב SSL והרעיון הוא פשוט לפתח פרוביידר קטן שמבצע את הקידוד באותה צורה כמו שמבוצע ב SSL
השרת מקודד את התוכן שנשלח בעזרת מפתח של השרת. הלקוח מקבל את האינפורמציה ומוסיף קידוד שלו (קידוד שלא סותר את זה של השרת מפני השלב הבא) -> השרת מקבל את האינפורמציה שוב ופותח את הקידוד שלו ואז מעביר ללקוח (תהליך ארוך ודיי יעיל שבוצע פשוט על ידי מתודות המוגדרות ב WS + מתודה אחת של קידוד ואחת של פתחת קידוד שמועברת אל הלקוח בהתחברות הראשונה שלו)
-
Hi and thank you for answering!
I will clear up my question:
My WCF service works behind SSL load balancer that terminates the SSL reuqests, so the service get http requests. after each request, the service replies back to the client via http and the SSL load balancer encrypt the messages back to https.
I'm using wsHttpBinding binding.
I've also attached a diagram that describes my working scenario:
My current work aroung is that the IIS decrypt/encrypt the messages, but performance are poor in compare to load balancer option.
I will be happy to have some kind of a solution.
Thank you,
Yaniv
-
זה בדיוק מה שהבנתי שאתה עושה גם בתשובה הקודמת שלי. אולי לא הצלחתי להסביר את עצמי מספיק טוב
1. אין צורך בשימוש ב load balancer כאשר אתה מפתח ב WCF מכיוון ש WCF מאפשר עבודה ישירה עם SSL. תבדוק את הקישור הבא אם הוא עוזר לך למשל:
http://stackoverflow.com/questions/425978/enable-ssl-for-my-wcf-service
* הערה: הקישור מדבר על עבודה עם מחלקת BasicHttpBinding ולא עם wsHttpBinding אבל אלו מחלקות מאוד דומות בעקרון (wsHttpBinding עדיפה כי היא גמישה יותר אבל בשניהם אפשר לעבוד עם אבטחה)
עוד קישור מעניין שכדאי לבדוק הוא הפרוייקט הבא:
http://www.codeproject.com/KB/WCF/WCFSSL.aspx2. רשמתי רעיון לביצוע ישיר ללא load balancer חיצוני אלא כחלק מהשירות WS. נסה להבין ולראות אם ההסבר ברור והרעיון לא יכול לעזור לך (יישמתי אותו פעם בפועל וזה עובד טוב אבל לדעתי היום כשעובדים עם WCF עדיף לעבוד בצורות המובנות של אבטחת SSL ולא בשיטה ששמתי מעל)
* חפש חומר על הכלי HttpCfg.exe tool הוא אמור לתת לך פתרון לעבודה מחוץ ל IIS למשל כשמפתחים שירות WCF שאינו תלוי ב IIS
** לא הבנתי למה שי לך בכלל בעיה בעבודה עם ה load balancer אם הוא עובד לך טוב. מדוע אתה בוחר לשנות את הארכיטקטורה של האפליקציה? (אולי יקפוץ לי עוד רעיון בהתאם)
- נערך על-ידי pituachMVP, Moderator יום רביעי 04 ינואר 2012 17:10
-
Hi again and thank you for answering!
We are working behind a load balancer in order to divide the requests load, so I cannot understand your answer stating not to use LB.
One advantage from using the LB is that we can also get the encypt/decrypt services, so the WCF service machines will only concentrate in doing the business logic.
I need some sort of a custom wsHttpBinding that will ensure that the clients will send and get https messages and the WCF service will get and send http messages.
-
היי
הדברים יותר ברורים :-)
רעיון 1: תשתמש ב LB רק בשביל ביצוע פעולת ה load balancer ז"א פעולת החלוקה של הבקשות הנכנסות השונות אל השרתים השונים אבל אל תבצע בו את הפעולה של הקידוד. ז"א ה LB יקבל בקשות וכמו קופסא שחורה פשוט יעביר אותם כפי שהן הלאה אל השרת המאתים. השרת לכן יקבל את ההודעה מקודדת ויעבוד עם WCF בעזרת SSL בצורה רגילה (למשל באחת הדרכים שהזכרתי מעל) ואת ההודעות אל הלקוח הוא יחזיר אל ה LB (שוב מקודדות כמובן). ה LB יחזיר את ה הודעות בלי בכלל "להבין" אותן אל הלקוח המקורי
בצורה זו המשקל הל פעולת הקידוד עובר אל השרתים בהם רץ השירות WCF
רעיון 2: יצריך אולי לימוד אבל יש משהו שיכול לעזור לך מאוד. אני ממליץ שתחפש חומר על TPL Dataflow (בשם יותר מקוצר TDF)
TDF = TPL Dataflow
TPL = Task Parallel Librarryהחלק שיכול לעזור לך זה הארכיטקטורה החדשה של Dataflow שכוללת LB מובנים בין השאר ואפשרויות ניהול האפליקציה כתרשים זרימה (מכאן השם Dataflow) ואובייקטים נהדרים לניהול queue (מעט מזכיר RX אם אתה מכיר).
-
שלום,
אם אחת מן התשובות פתרה את בעייתך, אנא סמן אותה על ידי לחיצה על "סמן כתשובה".
אם מצאת פתרון אחר, נשמח אם תשתף אותנו.
תודה,
צוות הפורומים.
אם תגובתי פתרה את בעייתך - לחץ/י, על "סמן כתשובה" ליד סימן ה V הירוק. מיקרוסופט מציעה שירות זה ללא תשלום, למטרת סיוע למשתמשים והעשרת הידע הקשור בטכנולוגיות ובמוצרים של Microsoft. תוכן זה מתפרסם כפי שהוא והוא אינו מעיד על כל אחריות מצד מיקרוסופט. -
-
אם תרצה 10 דקות שיחה בטלפון אולי אוכל להסביר את הרעיונות טוב יותר, או אם אתה יכול לפרט מדוע השיטות לא מתאימות לך אולי נמצא פתרון אחר
* אם כבר התייאשת מפתרון והחלטת שהמצב הנוכחי נסבל...
זה גם קורה :-) לפעמים הזמן למצוא פתרון מיטבי אינו שווה את הפתרון* אם מצאת פתרון אחר נשמח לשמוע גם בשבילנו וגם בשביל הבאים לפורום בעתיד
* בכל מקרה אם בחרת לסיים את השירשור אנא סגור אותו פשוט כדי שסימן השאלה יעלם לנו מהעיניים (מבחינתי סמן אפילו את ההודעה שלך כתשובה ותן לעצמך פידבק :-) החלק הזה לא מעניין אותי כל כך אבל זו הדרך היחידה שהממשק של מייקרוסופט מאפשר לסגור שירשור ולמנוע מאנשים להיכנס ולבזבז את הזמן אם השירשור מבחינתך סגור).
- נערך על-ידי pituachMVP, Moderator יום רביעי 11 ינואר 2012 17:00
-
הי.
מה שאתה מדבר עליו נקרא ssl offloading. כאשר מבצעים ssl offloading לפני WCF, למעשה WCF לא יודע שהוא secured ולכן אין צורך לשים אותו SSL.
מה שצריך לעשות זה את הפעולות הבאות:
1. להגדיר את ה-binding ללא security.
2. עבור metadata - להגדיר את ה-address של ה-endpoint עם https, אבל להוסיף ל-endpoint מאפיין listenUri שאומר לו לאיזו כתובת אמיתית להאזין. זה יאפשר האזנה על http אבל לרשום את הכתובת במטאדאטה כ-https
3. על מחלקת השירות לשים את ה-attribute של ServiceBehavior ולכוון את ה-AddressFilterMode ל-Any - זה יאפשר לשירות לקבל בקשה ל-http למרות שכתוב לו https.
כמובן שזה אומר שבין ה-f5 ל-WCF השירות לא מאובטח, וכן אינו דורש הזדהות. אם אתה צריך להזדהות מול השירות זה עוד כמה הגדרות שצריך לעשות.
Please mark posts as answers/helpful if it answers your question.
Senior Consultant on WCF, ASP.NET, Siverlight, and Entity Framework. Author of Microsoft's Official WCF 4 Course. Co-author of the Microsoft HPC/Azure burst whitepaper.
Visit my blog: http://blogs.microsoft.co.il/blogs/idof- הוצע כתשובה על-ידי Ido Flatow. _Moderator יום שלישי 31 ינואר 2012 09:52
- סומן כתשובה על-ידי pituachMVP, Moderator יום רביעי 16 אוקטובר 2013 10:44