none
העברת UserName באופן קבוע ב-WCF RRS feed

  • שאלה

  • במערכת שלנו ) .Net 3.5)  יש צורך לדעת פעמים רבות בWCF, מיהו המשתמש שההודעה הגיעה ממנו.

    יכול להיות שיש פקודות שמאפשרות את זה באופן מובנה ב-WCF, כמו:

    OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;

    הבעיה היא, שהמערכת מרובת מודולים, ולכל מודול WCF נפרד ויש פניות רבות מ-WCF אחד לשני, מה שיגרום לאיבוד המידע מיהו השולח הראשון.

     

    חשבתי אולי לצרף את המידע באופן תשתיתי להודעה ע"י Message Headers (וה-WCF ישלוף את המידע ויעביר אותו הלאה לקריאה הבאה)

    הבעיה היא שהקריאה שלנו לServices נעשתה במערכת דרך Proxy שנוצר דרך הWizard של Add Service Reference

    המערכת כוללת כבר היום מאות קריאות בדרך זו.

    כיצד ניתן להתערב בתהליך ולהוסיף את המידע באופן תשתיתי וקבוע?

    האם יש דרך אחרת לא לאבד את המידע בקריאה מWCF  אחד לשני?

    אשמח לקבל מידע.

    תודה!

     

    יום שלישי 12 אוקטובר 2010 07:19

תשובות

  • כדי שהשירות ידע מי הוא השולח יש לספק לו את אינפורמציה הנ"ל.

    ל - WCF יש תשתית יעודית לשם כך כפי שציינת ב - Message Security והוריאציות שלה. היתרון הגדול כאן הוא ש- WCF דואגת לאבטח את המידע הנ"ל תוך כדי המעבר ברשת.

    אם את רוצה ניתן לבנות custom behavior אותה ניתן לשדך גם לתוצאה של Add Service Reference (ע"י עדכון קונפיגורציה לדוגמא) אשר תדאג להוסיף את ה - header ב - Client ולקרוא את ה - header ב - Server.

    Header ניתן להוסיף ולקרוא גם באופן ידני:

    Client:

    using (OperationContextScope ocs = new OperationContextScope(prox.InnerChannel))
    {
    
        var header = new MessageHeader<string>("Hello");
        var headerBase = header.GetUntypedHeader("name", "ns");
              
        OperationContext.Current.OutgoingMessageHeaders.Add(headerBase);
            
    
        lblRes.Text = prox.Add(a, b).ToString();
    }
    

    server :

     Console.WriteLine("Header Value : {0}",OperationContext.Current.IncomingMessageHeaders.GetHeader<string>("name","ns"));

    הכול ניתן לעשות גם אם ה - Proxy נוצר ע"י Add Service reference .

    אני רק רוצה להזהיר: העברת אינפורציה רגישה כמו User ללא הגנה ב - Header שלך היא פעילות מסוכנת.

    מנו

     

     

    • הוצע כתשובה על-ידי Amit Peer יום חמישי 14 אוקטובר 2010 19:04
    • סומן כתשובה על-ידי Arik Poznanski יום שלישי 29 נובמבר 2011 15:09
    יום שלישי 12 אוקטובר 2010 07:51

כל התגובות

  • כדי שהשירות ידע מי הוא השולח יש לספק לו את אינפורמציה הנ"ל.

    ל - WCF יש תשתית יעודית לשם כך כפי שציינת ב - Message Security והוריאציות שלה. היתרון הגדול כאן הוא ש- WCF דואגת לאבטח את המידע הנ"ל תוך כדי המעבר ברשת.

    אם את רוצה ניתן לבנות custom behavior אותה ניתן לשדך גם לתוצאה של Add Service Reference (ע"י עדכון קונפיגורציה לדוגמא) אשר תדאג להוסיף את ה - header ב - Client ולקרוא את ה - header ב - Server.

    Header ניתן להוסיף ולקרוא גם באופן ידני:

    Client:

    using (OperationContextScope ocs = new OperationContextScope(prox.InnerChannel))
    {
    
        var header = new MessageHeader<string>("Hello");
        var headerBase = header.GetUntypedHeader("name", "ns");
              
        OperationContext.Current.OutgoingMessageHeaders.Add(headerBase);
            
    
        lblRes.Text = prox.Add(a, b).ToString();
    }
    

    server :

     Console.WriteLine("Header Value : {0}",OperationContext.Current.IncomingMessageHeaders.GetHeader<string>("name","ns"));

    הכול ניתן לעשות גם אם ה - Proxy נוצר ע"י Add Service reference .

    אני רק רוצה להזהיר: העברת אינפורציה רגישה כמו User ללא הגנה ב - Header שלך היא פעילות מסוכנת.

    מנו

     

     

    • הוצע כתשובה על-ידי Amit Peer יום חמישי 14 אוקטובר 2010 19:04
    • סומן כתשובה על-ידי Arik Poznanski יום שלישי 29 נובמבר 2011 15:09
    יום שלישי 12 אוקטובר 2010 07:51
  • ראשית, תודה על תגובתך!

     

    אם אני ארצה להשתמש בתשתית הייעודית (המוגנת), אני אאבד את המידע כאשר אני קוראת מ-WCF אחד לשני (כאשר אני צריכה לדעת מי הUser שהפעיל את השרשרת). לא?

     

    בשיטה של הHeader (אם אין ברירה אחרת) איך אני יוצרת Custom behaivor ומשדכת אותו לתוצאה של Add Service Reference ע"י קונפיגורציה?

     

     

    יום שלישי 12 אוקטובר 2010 12:32
  • אם אתה בדומין שאתה שולט עליו יש פתרון באמצעות Delegation. ראה: http://msdn.microsoft.com/en-us/library/ms730088.aspx

    המידע לקראת הסוף.

    אלון.

    שבת 15 ינואר 2011 02:27