2011-10-06 15 views
5

मैं इस प्रकार OperationContext बाहर जाने वाले संदेश शीर्ष लेख के लिए एक api कुंजी संलग्न करने के लिए कोशिश कर रहा हूँ:जोड़ना और प्राप्त कर रहा है डेटा

public static void AddApikeyToHeader(string apikey, IContextChannel channel, string address) 
    { 
     using (OperationContextScope scope = new OperationContextScope(channel)) 
     { 
      MessageHeader header = MessageHeader.CreateHeader("apikey", address, apikey); 
      OperationContext.Current.OutgoingMessageHeaders.Add(header); 

     } 
    } 

लेकिन तब मुझे पता नहीं कैसे सर्वर साइड पर हैडर को पुनः प्राप्त करने के लिए है । मैं एक सेवा प्राधिकरण प्रबंधक का उपयोग कर रहा हूँ और मैं वर्तमान ऑपरेटिंग संदर्भ मिलता है और इस तरह हेडर प्राप्त करने का प्रयास:

public string GetApiKey(OperationContext operationContext) 
    { 
     var request = operationContext.RequestContext.RequestMessage; 

     var prop = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]; 

     return prop.Headers["apikey"]; 
    } 

लेकिन कोई apikey हैडर वहाँ जुड़ी हुई है। साथ ही, जब मैं ऑपरेशन का निरीक्षण करता हूं तो डिबगिंग पर मैं कहीं भी अपने apikey शीर्षलेख को देखने के लिए प्रतीत नहीं कर सकता। क्या कोई देख सकता है कि मैं कहां गलत हो रहा हूं?

उत्तर

14

आप इस तरह से कस्टम हेडर जोड़ सकते हैं:

Guid apiKey = 
OperationContext.Current.IncomingMessageHeaders.GetHeader<Guid>("apiKey", "ns"); 
+0

धन्यवाद! मुझे पता चला कि मैं जिस समस्या का सामना कर रहा था, क्योंकि मैं संदर्भ क्षेत्र के जीवनकाल के दौरान अपनी सेवा कॉल नहीं कर रहा था! – Dimitar

+0

एक सेवा चैनल क्या है? IMyServiceChannel? – PositiveGuy

+0

IMyServiceChannel क्लाइंट और सर्वर के बीच संचार चैनल इंटरफ़ेस है। –

0

क्या आपने इस प्रश्न को देखा: How to add a custom HTTP header to every WCF call?? इसमें आपका समाधान हो सकता है।

+0

हाँ, मैंने इसे देखा था, मैं सेवा प्रमाणीकरण प्रबंधक को आजमाकर रखना चाहता हूं क्योंकि इसकी ज़रूरत है। – Dimitar

1

मैं यह सोचते कर रहा हूँ कि आप कुछ का उपयोग कर अपने सेवा का उपभोग करने की कोशिश कर रहा:

using (ChannelFactory<IMyServiceChannel> factory = 
     new ChannelFactory<IMyServiceChannel>(new NetTcpBinding())) 
     { 
     using (IMyServiceChannel proxy = factory.CreateChannel(...)) 
     { 
      using (OperationContextScope scope = new OperationContextScope(proxy)) 
      { 
      Guid apiKey = Guid.NewGuid(); 
      MessageHeader<Guid> mhg = new MessageHeader<Guid>(apiKey); 
      MessageHeader untyped = mhg.GetUntypedHeader("apiKey", "ns"); 
      OperationContext.Current.OutgoingMessageHeaders.Add(untyped); 

      proxy.DoOperation(...); 
      } 
     }      
    } 

और सेवा की ओर, आप की तरह शीर्ष लेख प्राप्त कर सकते हैं एचटीपी प्रोटोकॉल आधारित परिवहन (एसओएपी, आरईएसटी आदि)। मैं यह भी मान रहा हूं कि आप जो चाहते हैं वह आपूर्ति एपीआई कुंजी का उपयोग कर कॉलर को अधिकृत करना है। यदि दोनों स्थितियां आपके प्रश्न पर लागू होती हैं, तो आप पढ़ सकते हैं।

मुझे हाल ही में एक ही समस्या से निपटना पड़ा था कि मैंने एपीआई कुंजी नहीं पारित की लेकिन कुछ HTTP कस्टम हेडर का उपयोग करके उपयोगकर्ता नाम/पासवर्ड हैश संयोजन। अंततः मैंने एक कस्टम प्राधिकरण नीति को कार्यान्वित करके हल किया जिसे एक बार Web.config में कॉन्फ़िगर किया गया था जो अच्छी तरह से डब्ल्यूसीएफ पाइपलाइन में लगा हुआ था।

नीचे शुरू करने के लिए स्निपेट पर्याप्त होना चाहिए। आपको शायद अपनी एपीआई कुंजी का प्रतिनिधित्व करने वाले एकल द्वारा एक्स-एमएस-क्रेडेंशियल्स-XXX हेडर को प्रतिस्थापित करना होगा।

internal class RESTAuthorizationPolicy : IAuthorizationPolicy 
{ 
    public RESTAuthorizationPolicy() 
    { 
    Id = Guid.NewGuid().ToString(); 
    Issuer = ClaimSet.System; 
    } 

    public bool Evaluate(EvaluationContext evaluationContext, ref object state) 
    { 
    const String HttpRequestKey = "httpRequest"; 
    const String UsernameHeaderKey = "x-ms-credentials-username"; 
    const String PasswordHeaderKey = "x-ms-credentials-password"; 
    const String IdentitiesKey = "Identities"; 
    const String PrincipalKey = "Principal"; 

    // Check if the properties of the context has the identities list 
    if (evaluationContext.Properties.Count > 0 || 
     evaluationContext.Properties.ContainsKey(IdentitiesKey) || 
     !OperationContext.Current.IncomingMessageProperties.ContainsKey(HttpRequestKey)) 
     return false; 

    // get http request 
    var httpRequest = (HttpRequestMessageProperty)OperationContext.Current.IncomingMessageProperties[HttpRequestKey]; 

    // extract credentials 
    var username = httpRequest.Headers[UsernameHeaderKey]; 
    var password = httpRequest.Headers[PasswordHeaderKey]; 

    // verify credentials complete 
    if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) 
     return false; 

    // Get or create the identities list 
    if (!evaluationContext.Properties.ContainsKey(IdentitiesKey)) 
     evaluationContext.Properties[IdentitiesKey] = new List<IIdentity>(); 
    var identities = (List<IIdentity>) evaluationContext.Properties[IdentitiesKey]; 

    // lookup user 
    using (var con = ServiceLocator.Current.GetInstance<IDbConnection>()) 
    { 
     using (var userDao = ServiceLocator.Current.GetDao<IUserDao>(con)) 
     { 
     var user = userDao.GetUserByUsernamePassword(username, password); 

     ... 
संबंधित मुद्दे