2016-03-12 3 views
5

मेरे पास एक जावा वेब ऐप है जो एक खोज सेवा प्रदान करता है, और कुछ मामलों में परिणामों के लिए सुरक्षा की जांच करने की आवश्यकता होती है। यदि यह मायने रखता है, तो यह स्प्रिंग एमवीसी में लागू किया गया है और जेटी के तहत चल रहा है। (एक अलग लॉगिन से बचने के लिए)जावा से एडीएफएस प्रमाणीकरण और प्रतिरूपण (जेटी के तहत स्प्रिंग एमवीसी) आवेदन

  • सक्रिय निर्देशिका फेडरेशन सेवाएँ (ADFS) के बजाय मौजूदा निर्माण-इन प्रणाली के माध्यम से किया रहें:

    मैं एक ग्राहक वेब एप्लिकेशन के प्रमाणीकरण चाहते हैं, जो करने के लिए है।

  • खोज सर्वर पर रिमोट उपयोगकर्ता का प्रतिरूपण करने में सक्षम हो, जैसे कि सुरक्षा जांच को खोज सर्वर पर एक अलग एप्लिकेशन निष्पादित करने के लिए किया जा सकता है (जो स्वयं को ADFS के बारे में कुछ नहीं जानता है, लेकिन प्रासंगिक चेक करने में सक्षम है प्रश्न में उपयोगकर्ता के रूप में चलाएं)।

यह संभव है, और यदि हां, तो कैसे?

(क्षमा याचना करता है, तो विंडोज दुनिया शब्दावली थोड़ा दूर है - यह कुछ मैं के बारे में पता नहीं है, लेकिन उम्मीद है कि कम से कम इरादा स्पष्ट है) पहेली मैं के टुकड़े पर


कुछ नोट्स पहले से ही देखा गया है:

  1. Impersonating a user from a Java Servlet, एक सवाल मैं साल पहले लगभग एक ही जमीन को कवर के एक नंबर था है, लेकिन ADFS आवश्यकता के बिना - मुझे यकीन है कि कैसे ADFS प्रभावों बातें नहीं कर रहा हूँ, लेकिन वाफ़ल (समाधान उस प्रश्न के लिए) इसके लिए कोई समर्थन प्रदान नहीं कर रहा है।
  2. मैंने Java application with SSO (SAML) and ADFS और How do I talk to ADFS from Java? देखा है, जो एडीएफएस प्रमाणीकरण के लिए एक रास्ता प्रदान करने लगते हैं, लेकिन मुझे यकीन है कि अगर यह बाद में प्रतिरूपण के साथ संगत है।
  3. मैं http://blogs.objectsharp.com/post/2010/09/10/Converting-Claims-to-Windows-Tokens-and-User-Impersonation.aspx और https://msdn.microsoft.com/en-au/library/ee517278.aspx देखा है, लेकिन मैं अनिश्चित हूँ:

    1. अगर मैं अगर मैं ऊपर
    2. यह चाहे SAML या OAuth मार्ग का अनुसरण यह करने के लिए आवश्यक दावों का लाभ उठा सकेंगे लागू करने के लिए संभव जावा
    3. के भीतर से
  4. मुझे लगता है कि दूसरा (प्रतिरूपण) हिस्सा लगभग Impersonating ASP.NET claims identity to windows identity रूप में ही है, सिवाय इसके कि मैं जावा के बजाय नेट के भीतर से यह करना चाहते हैं।

उत्तर

3

आप एडीएफएस संस्करण का उल्लेख नहीं करते हैं?

  • WS-फेड
  • SAML
  • OAuth2

जावा दुनिया में, SAML सामान्य रूप से प्रयोग किया जाता है:

आप तीन विकल्प। जो एक एसएएमएल ढेर का तात्पर्य है।

ऊपर दिए गए SO लिंक में SAML स्टैक की सूची के लिंक के साथ मेरा उत्तर है।

चूंकि आप पहले से ही वसंत का उपयोग कर रहे हैं, वसंत सुरक्षा एक अच्छा फिट लगता है।

Spring Security SAML Extension

ADFS वर्तमान में OpenID Connect ने जो OAuth नियम बाहर समर्थन नहीं करता।

हां - वसंत सुरक्षा आपको एडीएफएस द्वारा उत्पन्न दावों की एक सूची प्रदान करती है।

एडीएफएस Identity Delegation के माध्यम से प्रतिरूपण प्रदान करता है।

दुर्भाग्य से, यह आमतौर पर डब्ल्यूसीएफ और डब्ल्यूआईएफ (दोनों .NET संरचनाओं) के माध्यम से किया जाता है।

3

मेरे पास एक समान एप्लीकेशन है- मेरा वेब अनुप्रयोग के बजाय एक स्विंग क्लाइंट है, लेकिन प्रक्रिया समान होनी चाहिए। ऑन-प्रिमाइसेस ADFS सर्वर के साथ पहले प्रमाणीकरण के बाद इसे एडब्ल्यूएस एपीआई का उपयोग करके अनुमानित भूमिका के तहत प्रश्न सबमिट करने की आवश्यकता है। हमारे पर्यावरण में, एडीएफएस को एसएएमएल दावे देने के लिए कॉन्फ़िगर किया गया है और इन्हें पहचानने के लिए एडब्ल्यूएस को कॉन्फ़िगर किया गया है। तो, यह मैं क्या कर रहा है:

  1. जब आवश्यक हो, आवेदन अपने सामान्य नेटवर्क क्रेडेंशियल के लिए उपयोगकर्ता को संकेत देता है और इन ADFS से एक saml कथन अनुरोध करने के लिए उपयोग किया जाता है। मैं अपाचे HttpClient कॉल करने के लिए उपयोग करें:

    private String getAdfsResponse(String username, String password) throws Exception { 
    
    log.debug("Trying to log onto ADFS server for {}", username); 
    
    // Lax redirect policy is needed so that all HTTP 302 redirects are followed after hitting the initial ADFS URL. 
    try (CloseableHttpClient httpClient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build()) { 
    
        HttpUriRequest login = RequestBuilder.post() 
          .setUri(new URI(ADFS_URL)) 
          .addParameter("UserName", username) 
          .addParameter("Password", password) 
          .build(); 
    
        CloseableHttpResponse response = httpClient.execute(login); 
    
        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
    
         HttpEntity responseEntity = response.getEntity(); 
         String adfsResponse = EntityUtils.toString(responseEntity, "UTF-8"); 
         log.debug("ADFS server responded with {}", adfsResponse); 
         return adfsResponse; 
    
        } else { 
    
         throw new Exception("ADFS server responded with " + response.getStatusLine()); 
    
        } 
    } 
    } 
    
  2. क्रेडेंशियल्स मान्य रहे हैं, तो ADFS एक SAML प्रतिसाद कि एक HTML रूप की तरह दिखता है, लेकिन एक SAMLResponse नाम/मान युग्म के साथ एक input तत्व शामिल देता है।

  3. जब SAMLResponsevalue विशेषता बेस 64-डीकोडेड है तो इसमें SAML दावा होगा। एडब्ल्यूएस के लिए, मुझे कुछ भूमिका जानकारी निकालने की आवश्यकता है और मैं एडब्ल्यूएस एसटीएस (सुरक्षा टोकन सेवा) को कॉल करने के लिए पूर्ण SAMLResponse के साथ इसका उपयोग करता हूं। यदि सभी एडब्ल्यूएस के साथ ठीक हैं, तो मुझे अस्थायी सुरक्षा प्रमाण-पत्रों का एक सेट प्राप्त होता है जिसका मैं उन प्रश्नों के लिए उपयोग कर सकता हूं जिन्हें मैं वास्तव में बनाना चाहता हूं। पूरे राउंड ट्रिप http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html

यह सब ADFS पर निर्भर करता है और अन्य पार्टी SAML-विन्यस्त किया जा रहा है, और अन्य पार्टी के लिए आप उनके पक्ष पर एक विशेष भूमिका ग्रहण देता है कि एक उपयुक्त एपीआई प्रदान करने के लिए वर्णित है। क्या आप इस तरह की चीज का सामना कर रहे हैं?

+0

मुझे लगता है कि मेरी समस्या के मूल कि अन्य पार्टी इसका समर्थन नहीं करता है, तो जिस तरह से हम तारीख करने के लिए इसे प्रभावित किया गया है दूरदराज (https://msdn.microsoft.com CreateProcessAsUser के साथ उपयोगकर्ता नाम से कार्य कर रहा है जेएनआई के माध्यम से /en-au/library/windows/desktop/ms682429(v=vs.85).aspx), लेकिन एडीएफएस/एसएएमएल दुनिया में, यह स्पष्ट नहीं है कि मुझे कार्य करने की आवश्यकता वाले टोकन को कैसे प्राप्त किया जाएगा। –

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