2008-08-19 32 views
21

से .NET वेब सेवा (WSE 2/3, WS-Security) को कॉल करना मुझे जावा से .NET में लिखी गई एक वेब सेवा कॉल करने की आवश्यकता है। वेब सेवा डब्लूएस-सिक्योरिटी स्टैक (या तो डब्लूएसई 2 या डब्लूएसई 3 लागू करती है, यह मेरे पास मौजूद जानकारी से स्पष्ट नहीं है)।जावा

सेवा प्रदाता से प्राप्त जानकारी में डब्लूएसडीएल, एक पॉलिसी कैश.कॉन्फिग फ़ाइल, कुछ नमूना सी # कोड, और नमूना एप्लिकेशन शामिल है जो सफलतापूर्वक सेवा को कॉल कर सकता है।

यह उतना उपयोगी नहीं है जितना लगता है क्योंकि यह स्पष्ट नहीं है कि जावा क्लाइंट लिखने के लिए मुझे इस जानकारी का उपयोग कैसे करना है। यदि नीति के अनुसार वेब सेवा अनुरोध पर हस्ताक्षर नहीं किया गया है तो इसे सेवा द्वारा खारिज कर दिया जाता है। मैं अपाचे एक्सिस 2 का उपयोग करने की कोशिश कर रहा हूं और मुझे क्लाइंट उत्पन्न करने के लिए पॉलिसी कैस.कॉन्फिग फ़ाइल और डब्लूएसडीएल का उपयोग करने के बारे में कोई निर्देश नहीं मिल रहा है।

कई उदाहरण हैं जो मैंने वेब पर पाए हैं लेकिन सभी मामलों में उदाहरणों के लेखकों ने सेवा और ग्राहक दोनों का नियंत्रण किया था और इसलिए काम करने के लिए दोनों पक्षों पर बदलाव करने में सक्षम थे । मैं उस स्थिति में नहीं हूँ।

क्या किसी ने इसे सफलतापूर्वक किया है?

+0

डब्ल्यूएसई अप्रचलित है, और केवल तभी उपयोग किया जाना चाहिए जब कोई अन्य विकल्प न हो। –

+0

@ माइकल: दोस्त, मुझे तुम्हारा दर्द महसूस होता है (क्योंकि मेरी हाउटो खोज ने मुझे यहां ले जाया था)। – Roboprog

उत्तर

9

यह एक लोकप्रिय सवाल प्रतीत होता है, इसलिए मैं अपनी स्थिति में हमने जो किया है उसका एक अवलोकन प्रदान करूंगा।

ऐसा लगता है कि .NET में निर्मित सेवाएं पुराने ws-addressing standard (http://schemas.xmlsoap.org/ws/2004/03/addressing/) का पालन कर रही हैं और अक्ष 2 केवल नए मानक (http://schemas.xmlsoap.org/ws/2004/08/addressing/) को समझता है।

इसके अतिरिक्त, प्रदान की गई policyCache.config फ़ाइल एक रूप में है कि अक्ष 2 रैंपर्ट मॉड्यूल समझ में नहीं आता है।

तो कदम हम करना था, संक्षेप में:

  • policyCache.config पढ़ें और इसे समझने की कोशिश करते हैं। फिर इसे उस नीति में दोबारा लिखें जो रैंपर्ट समझ सके। (कुछ updated docs मदद की।)
  • इस नीति के साथ रैंपर्ट कॉन्फ़िगर करें।
  • .pfx फ़ाइल में प्रदान की गई कुंजी लें और उन्हें जावा कुंजी स्टोर में रूपांतरित करें। जेटी के साथ आने वाली एक उपयोगिता है जो ऐसा कर सकती है।
  • उस कुंजी स्टोर के साथ रैंपर्ट कॉन्फ़िगर करें।
  • एक कस्टम अक्ष 2 हैंडलर लिखें जो पिछली ws-addressing सामग्री को पिछड़ा-परिवर्तित करता है जो कि सेवा द्वारा अपेक्षित पुरानी सामग्री में अक्ष 2 से बाहर आता है।
  • आउटगोइंग संदेशों पर हैंडलर का उपयोग करने के लिए अक्ष 2 को कॉन्फ़िगर करें।

अंत में यह विक्रेताओं द्वारा समर्थित खुले मानक के रूप में माना जाने वाला कुछ कॉन्फ़िगरेशन और कोड था।

हालांकि मुझे यकीन नहीं है कि विकल्प क्या है ... क्या आप विक्रेताओं (या इस मामले में, एक विक्रेता) को यह सुनिश्चित करने के लिए इंतजार कर सकते हैं कि सब कुछ इंटर-ऑप होगा?

एक पोस्टस्क्रिप्ट के रूप में मैं जोड़ूंगा कि मैंने काम करने को समाप्त नहीं किया है, यह मेरी टीम पर कोई और था, लेकिन मुझे लगता है कि मुझे मुख्य विवरण सही मिला है। दूसरा विकल्प जिसे मैं विचार कर रहा था (मेरे साथियों ने संभालने से पहले) को डब्ल्यूएसएस 4 जे एपीआई को सीधे एसओएपी लिफाफा बनाने के लिए कॉल किया था क्योंकि .NET सेवा ने इसकी अपेक्षा की थी। मुझे लगता है कि यह भी काम किया होगा।

+0

यह ws-addressing मुद्दा गधे में एक वास्तविक दर्द है। डब्लूएसएस 2 डब्लूएस-एड्रेसिंग के पुराने, प्री-रिलीज संस्करण का उपयोग नहीं करता है, यह साबुन हेडर (जैसे wsa: via) में प्रोप्राइट्री तत्व जोड़ता है जो स्कीमा का हिस्सा नहीं है। क्या एक क्रॉक है। – skaffman

+2

हर किसी को यह ध्यान में रखना चाहिए कि डब्लूएसई अप्रचलित है। उभरते डब्ल्यूएस- * स्टैक का उपयोग करने के लिए .NET वेब सेवाओं को अनुमति देने के लिए यह एक अंतरिम समाधान था। यह आश्चर्यजनक नहीं होना चाहिए अगर यह अंतिम मानकों का समर्थन नहीं करता है। WCF _does_ WS- * प्रोटोकॉल के अंतिम मानक संस्करणों का समर्थन करता है। इसने डब्लूएसई को बदल दिया है, और सभी नए विकास के लिए इस्तेमाल किया जाना चाहिए। डब्ल्यूएसई कोड ASAP को बदला जाना चाहिए। –

+1

@ जॉन: क्लाइंट को लागू करने वाले लोगों के पास सर्वर को लागू करने के लिए विक्रेता द्वारा उपयोग की जाने वाली अधिक पसंद नहीं होती है। मैं देखता हूं कि आप अपनी जिंदगी इस सामान को कर रहे हैं, लेकिन देवताओं के लिए जो इस सामान के साथ एकीकृत होना चाहते हैं, यह वास्तव में बेकार है कि यह * एक * सही ट्रेंड विक्रेता से सिर्फ सही संस्करण के सही औजारों पर निर्भर है। Http://72.249.21.88/nonintersecting/?year=2006&monthnum=11&day=15&name=the-s-stands-for-simple&page – Roboprog

0

CXF - मैं सीएक्सएफ में देखता हूं। मैंने इसे ws-secuirty का उपयोग कर जावा में एक वेब सेवा और क्लाइंट बनाने के लिए उपयोग किया है। मैंने इसे एक .NET वेब सेवा भी जुड़ा है।

उनके पास भी बहुत अच्छा दस्तावेज है। अक्ष के मुकाबले मैं इसके साथ अधिक भाग्यशाली था।

1
0

मुझे लगता है कि मुझे और स्पष्ट होना चाहिए - मैंने सेवा के लिए क्लाइंट कोड उत्पन्न करने के लिए wsdl2java कोड जेनरेटर का उपयोग किया है। हालांकि जेनरेट कोड में आवश्यक डब्ल्यूएस-सिक्योरिटी एसओएपी हेडर शामिल नहीं हैं ताकि सेवा अनुरोध स्वीकार करे।

+0

क्या आपको यह पता चला? मुझे एक समान कार्य का सामना करना पड़ रहा है और अभी तक सभी भागों को एक ढांचे के साथ काम नहीं करना है, (मैं सीएक्सएफ का उपयोग कर सकता हूं लेकिन एसएसएल के साथ समस्याएं हैं, जिसमें रैंपर्ट कॉन्फ़िगरेशन के साथ समस्याएं हैं)। ऐसा लगता है कि अधिकांश उदाहरणों में ग्राहक और सर्वर पर नियंत्रण होता है। –

+0

@aurealus - हाँ हमने किया, इस सवाल को अपडेट किया। उम्मीद है कि यह आपकी मदद करेगा। :) –

2

@Mike

मैं हाल ही में एक परीक्षण किया था और इस कोड को मैं प्रयोग किया जाता है। मैं नीति सामग्री का उपयोग नहीं कर रहा हूं, लेकिन मैंने सादा पाठ प्रमाणीकरण के साथ डब्ल्यूएस-सुरक्षा का उपयोग किया। सीएक्सएफ के पास इस सामान को पूरा करने के तरीके पर वास्तव में अच्छा दस्तावेज है।

मैंने wsdl2java का उपयोग किया और फिर इस कोड को ws-security के साथ वेब सेवा का उपयोग करने के लिए जोड़ा।

मुझे आशा है कि यह आपकी मदद करेगा।

import java.io.IOException; 
import java.util.HashMap; 
import java.util.Map; 

import javax.security.auth.callback.Callback; 
import javax.security.auth.callback.CallbackHandler; 
import javax.security.auth.callback.UnsupportedCallbackException; 

import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor; 
import org.apache.ws.security.WSConstants; 
import org.apache.ws.security.WSPasswordCallback; 
import org.apache.ws.security.handler.WSHandlerConstants; 

public class ServiceTest implements CallbackHandler 
{ 

    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { 

      WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; 
      // set the password for our message. 
      pc.setPassword("buddah"); 
     } 

    public static void main(String[] args){ 
     PatientServiceImplService locator = new PatientServiceImplService(); 
     PatientService service = locator.getPatientServiceImplPort(); 

     org.apache.cxf.endpoint.Client client = org.apache.cxf.frontend.ClientProxy.getClient(service); 
     org.apache.cxf.endpoint.Endpoint cxfEndpoint = client.getEndpoint(); 

     Map<String, Object> outProps = new HashMap<String, Object>(); 
     outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN + " " + WSHandlerConstants.TIMESTAMP); 
     outProps.put(WSHandlerConstants.USER, "joe"); 
     outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT); 

     // Callback used to retrieve password for given user. 
     outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, ServiceTest.class.getName()); 

     WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps); 
     cxfEndpoint.getOutInterceptors().add(wssOut); 


     try 
     { 
      List list = service.getInpatientCensus(); 
      for(Patient p : list){ 
       System.out.println(p.getFirstName() + " " + p.getLastName()); 
      } 

     } 
     catch (Exception e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
9

WS-सुरक्षा विनिर्देशों आम तौर पर एक डबल्यूएसडीएल (एक WSE डबल्यूएसडीएल में कभी नहीं) में शामिल नहीं हैं। तो wsdl2java यह नहीं जानता कि इस सेवा के लिए डब्ल्यूएस-सुरक्षा भी आवश्यक है। तथ्य यह है कि डब्लूएसई डब्ल्यूएसडीएल में सुरक्षा बाधाएं मौजूद नहीं हैं मेरे लिए एक बड़ी निराशा है (डब्ल्यूसीएफ में डब्लूएसडीएल में डब्ल्यूएस-ट्रस्ट जानकारी शामिल होगी)।

ग्राहक अंत में, आपको अपने आउटगोइंग क्लाइंट संदेश में आवश्यक डब्ल्यूएस-सुरक्षा शीर्षलेख जोड़ने के लिए Rampart का उपयोग करना होगा। चूंकि डब्लूएसडीएल रिपोर्ट नहीं करता है कि डब्लूएस-सुरक्षा सेटिंग्स क्या आवश्यक हैं, इसलिए सेवा प्रदाता से पूछकर आप सबसे अच्छे हैं। डब्ल्यूएस-सुरक्षा आवश्यकताएं साधारण सादे टेक्स्ट पासवर्ड हो सकती हैं, या X509 प्रमाण पत्र हो सकती हैं, या एन्क्रिप्टेड संदेश हो सकता है .....रैंपर्ट इन परिदृश्यों में से अधिकांश को संभालने में सक्षम होना चाहिए।

Apache Rampart आपकी axis2.xml फ़ाइल में मॉड्यूल को जोड़कर "चालू" है। आपको रैंपर्ट मॉड्यूल डाउनलोड करने और इसे अपनी अक्ष 2 निर्देशिका में एक विशिष्ट स्थान पर रखने की आवश्यकता होगी, फिर xml फ़ाइल को संशोधित करें। आप रैंपर्ट को प्रोग्रामिक रूप से भी संलग्न कर सकते हैं (यदि यह एक आवश्यकता है तो कृपया अपना मूल प्रश्न संपादित करें और मैं इस प्रतिक्रिया को संपादित करूंगा)।

रैंपर्ट (अन्य एक्सएमएल फाइलों या प्रोग्रामेटिक रूप से) को कॉन्फ़िगर करने के तरीके के आधार पर, यह किसी भी आउटगोइंग संदेशों को रोक देगा और आवश्यक डब्लूएस-सुरक्षा जानकारी को इसमें शामिल करेगा। मैंने व्यक्तिगत रूप से अक्षांश 2 को WSE3 सेवा को कॉल करने के लिए रैंपर्ट के साथ उपयोग किया है जो सादे टेक्स्ट में उपयोगकर्ता नाम टोकन से सुरक्षित है और यह बहुत अच्छा काम करता है। इसी तरह, लेकिन अधिक उन्नत परिदृश्य भी काम करना चाहिए। ऊपर लिंक की गई साइट पर रैंपर्ट के साथ सेट अप करने और शुरू करने के तरीके के बारे में और जानकारी है। यदि आपको रैंपर्ट के विनिर्देशों या अपने विशेष WSE सेटअप के साथ रैंपर्ट का उपयोग करने के बारे में समस्याएं हैं, तो अपना प्रश्न संपादित करें और मैं जवाब देने के लिए अपना सर्वश्रेष्ठ प्रयास करूंगा।