11

यहाँ मैंक्या मैं फॉर्म ऑथ के साथ प्रमाणीकृत क्लाइंट का प्रतिरूपण कर सकता हूं और SQL सर्वर पर एक विश्वसनीय कनेक्शन स्थापित कर सकता हूं?

बिल्ड रूपों प्रमाणीकरण और सक्रिय निर्देशिका सदस्यता के साथ एक ASP.NET MVC 3 आवेदन करने का प्रयास कर रहा है क्या है। वेब सर्वर और डेटाबेस अलग-अलग भौतिक सर्वर हैं इसलिए एक डबल हॉप।

मैंने सोचा कि उत्तर constrained delegation and protocol transition पर यह पुराना आलेख था? अब तक, मैं तकनीक को काम करने में सक्षम नहीं हूं।

मैं उत्पादन सेटअप में विंडोज 2008 (आईआईएस 7) पर तैनात करने से पहले वेब सर्वर के लिए अपनी डीवी मशीन (विंडोज 7, आईआईएस 7) से इसका परीक्षण कर रहा हूं। क्या विंडोज 2008 एक फर्क पड़ता है?

क्या काम करता है और क्या विफल रहता है

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

public void AsUser(Action action) 
    { 
     using (var id = new WindowsIdentity(User.Identity.Name + @"@example.com")) 
     { 
      WindowsImpersonationContext context = null; 
      try 
      { 
       context = id.Impersonate(); 
       action.Invoke(); 
      } 
      catch (Exception ex) 
      { 
       // ex.Message is The type initializer for System.Data.SqlClient.SqlConnection threw an exception 
       // buried inner exeption is Requested registry access is not allowed 
      } 
      finally 
      { 
       if (context != null) 
       { 
        context.Undo(); 
       } 
      } 
     } 
    } 

यह मैं अपने स्थानीय देव सर्वर पर सेटअप मुद्दे पर विश्वास करने के लिए एक अपवाद मुझे प्रमुख के साथ विफल रहता है। आंतरिक अपवाद Requested registry access is not allowed है।

अगर मैं Impersonate() कॉल मुझे लगता है कि ImpersonationLevelIdentification को सेट होने के बाद एक ब्रेकपाइंट सेट और निरीक्षण WindowsIdentity। यह एक सुराग की तरह लगता है कि यह सही ढंग से सेटअप नहीं है। क्या कोई पुष्टि कर सकता है?

क्या मैं सही रास्ते पर हूं और क्या यह सेटअप करना भी संभव है? किसी भी पॉइंटर्स की सराहना की जाएगी।

उत्तर

5

मुझे लगता है कि आप सही रास्ते पर हैं। आपको बस अपने प्रोटोकॉल संक्रमण सेटअप पर अधिक समस्या निवारण कार्य की आवश्यकता है।

मुझे लगता है कि आपने अपनी सक्रिय निर्देशिका सदस्यता प्रदाता को सही तरीके से कॉन्फ़िगर किया है ताकि आप सक्रिय निर्देशिका उपयोगकर्ता नाम और पासवर्ड का उपयोग करके अपने वेब पेज को सफलतापूर्वक लॉगऑन कर सकें। यदि ऐसा नहीं है, तो कृपया मेरे बाकी उत्तरों को अनदेखा करें :)

मैंने आपके प्रश्न में जो देखा, उससे आपको अपने उपयोगकर्ता के टोकन को WindowsIdentity द्वारा S4USelf का उपयोग करके मिला। फिर, आप SQL सर्वर पर प्रतिरूपित टोकन को पास करने के लिए S4UProxy का उपयोग कर रहे हैं। चूंकि आपने कहा था कि आपको केवल ImpersonationLevel.Identification मिल गया है, इसका मतलब है कि आप प्रोटोकॉल संक्रमण करने में विफल रहे हैं।

आपको यह समझने की आवश्यकता है कि एक मशीन में प्रोटोकॉल संक्रमण करने के लिए एक मशीन को बहुत उच्च विशेषाधिकार है।प्रोटोकॉल संक्रमण करने के लिए सर्वर को अनुदान देने का मतलब है कि आप उस सर्वर पर विश्वास करते हैं कि वह लगभग डोमेन नियंत्रक की तरह हो। सर्वर को इस क्षमता को बदलने के लिए आपको एडी में यह निर्णय सावधानी से करने की आवश्यकता है और आपको यह परिवर्तन करने के लिए एक डोमिन व्यवस्थापक होना होगा। यदि आपने ऐसा नहीं किया है, तो संभवतः आपने अपनी बात ठीक से सेट नहीं की है।

कुछ चीजें जांचने के लिए हैं।

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

दूसरा, आपको यह सुनिश्चित करना होगा कि एसपीएन ठीक से सेट हो जाएं। मुझे एहसास है कि आपके द्वारा पोस्ट किया गया लिंक केवल आपके एएसपी.NET सेवा खाते के एसपीएन का उल्लेख करता है। असल में, आपको यह सुनिश्चित करने की भी आवश्यकता है कि आपके SQL सर्वर पर सेवा खाता भी ठीक से सेट हो। अन्य, विंडोज़ बिल्कुल केर्बेरोज प्रमाणीकरण का उपयोग नहीं करेगा। यह एनटीएलएम का उपयोग करने के लिए वापस आ जाएगा। SQL सर्वर पर एक एसपीएन सही ढंग से सेटअप करने के लिए बहुत सारे विवरण हैं। आप पहले here देख सकते हैं और देख सकते हैं कि आपके पास कोई भाग्य है या नहीं। मेरे अनुभव से, अधिकांश डीबीए नहीं जानते कि उन्हें ठीक से कैसे सेट अप करें। उन्हें इसके बारे में भी पता नहीं है क्योंकि अधिकांश एप्लिकेशन एनटीएलएम के साथ ठीक काम करते हैं। आपको SQL सर्वर सेवा खाते और उस पोर्ट नंबर पर ध्यान देना होगा जिसका उपयोग वह कर रहा है।

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

अद्यतन

मैं बस आप शिक्षण कैसे सेटअप ASP.NET के लिए प्रोटोकॉल संक्रमण के लिए another article पाया। इसने उल्लेख किया है कि आपको आईआईएस सेवा खाते के लिए टीसीबी अधिकार देने की आवश्यकता है ताकि यह सुनिश्चित किया जा सके कि यह Impersonation प्रकार WindowsIdentity बना सकता है। आप इसे एक शॉट दे सकते हैं।

+0

सभी जानकारी के लिए धन्यवाद। यह मेरे लिए बहुत नया था। मेरे पास अभी तक सब कुछ रीसेट करने और इस नए ज्ञान से शुरू करने का समय नहीं है, लेकिन मुझे पूरा भरोसा है कि मैं इसे अभी काम कर सकता हूं। –

+0

इस तरह का बेकार है ... बकाया होने तक 13 मिनट के साथ मैंने जवाब को जवाब के रूप में चुना है कि यह बकाया राशि को "पुरस्कृत" से अलग नहीं है। आपके पास आधा होना चाहिए जो आपके पास होना चाहिए। मुझे खेद है कि मैं सिस्टम को समझ नहीं पाया था या शायद मैं यूआई में सुराग चूक गया - या तो मेरे बुरे तरीके से। –

+0

@Aaron कोई चिंता नहीं। मेरा जवाब स्वीकार करने के लिए धन्यवाद। प्रोटोकॉल ट्रांजिस्टियन काम करने के बाद, वास्तव में कुछ और सामान्य केर्बेरोज समस्याएं होती हैं जिन्हें आप चला सकते हैं। जैसे यदि एक ही एडी वन में डुप्लीकेट एसपीएन हैं, तो केर्बेरो प्रमाणीकरण चुपचाप काम करना बंद कर देगा। इस तरह के प्रश्नों का पूरा उत्तर लिखना बहुत मुश्किल है। यदि हम कर सकते हैं, तो एमएसडीएन को इसी तरह की समस्या के लिए कई लेख और केबी की आवश्यकता नहीं होगी। यदि आप कुछ अन्य एडी मुद्दों में भाग रहे हैं, तो 'सक्रिय-निर्देशिका' वाले प्रश्न को टैग करें। आपको अधिक उपयोगी संकेत मिल सकते हैं –

1

क्या आपने विंडोज 7 या विंडोज 2008 मशीन पर प्रतिरूपण सक्षम किया है? इस आलेख में इसे सेट अप करने का तरीका शामिल है। http://technet.microsoft.com/en-us/library/cc730708(WS.10).aspx। साथ ही, क्या आप 32-बिट या 64-बिट चल रहे हैं?

+0

64-बिट। क्या इससे कोई फर्क पड़ता है? कभी-कभी –

+0

। इस मामले में मुझे शक है। अधिक जानकारी हमेशा बेहतर होती है हालांकि – Spidy

1

आपको यह देखने के लिए अपने एडी प्रशासन से भी जांच करनी चाहिए कि प्रतिरूपण की अनुमति है या नहीं। मेरी कंपनियां एडी नीतियां प्रतिरूपण की अनुमति नहीं देगी।

2

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

public class ImpersonationHelper : IDisposable 
    { 
     private const int LOGON32_LOGON_INTERACTIVE = 2; 
     private const int LOGON32_PROVIDER_DEFAULT = 0; 
     private WindowsImpersonationContext _impersonationContext; 
     private string _userName; 
     private string _domain; 
     private string _password; 

     [DllImport("advapi32.dll")] 
     public static extern int LogonUserA(String lpszUserName, 
      String lpszDomain, 
      String lpszPassword, 
      int dwLogonType, 
      int dwLogonProvider, 
      ref IntPtr phToken); 
     [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern int DuplicateToken(IntPtr hToken, 
      int impersonationLevel, 
      ref IntPtr hNewToken); 

     [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern bool RevertToSelf(); 

     [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
     public static extern bool CloseHandle(IntPtr handle); 

     public ImpersonationHelper(string domain, string userName, string password) 
     { 
      _userName = userName; 
      _domain = domain; 
      _password = password; 
     } 

     public void Start() 
     { 
      WindowsIdentity tempWindowsIdentity; 
      IntPtr token = IntPtr.Zero; 
      IntPtr tokenDuplicate = IntPtr.Zero; 

      if (RevertToSelf()) 
      { 
       if (LogonUserA(_userName, _domain, _password, LOGON32_LOGON_INTERACTIVE, 
        LOGON32_PROVIDER_DEFAULT, ref token) != 0) 
       { 
        if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) 
        { 
         tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); 
         _impersonationContext = tempWindowsIdentity.Impersonate(); 
         if (_impersonationContext != null) 
         { 
          CloseHandle(token); 
          CloseHandle(tokenDuplicate); 
         } 
        } 
       } 
      } 
      if (token != IntPtr.Zero) 
       CloseHandle(token); 
      if (tokenDuplicate != IntPtr.Zero) 
       CloseHandle(tokenDuplicate); 
     } 

     #region IDisposable Members 

     void IDisposable.Dispose() 
     { 
      if (_impersonationContext != null) 
      { 
       _impersonationContext.Undo(); 
      } 
     } 

     #endregion 
    } 
+0

कोड के लिए धन्यवाद। मुझे बाहरी कॉल के बिना खुश प्रबंधित भूमि में रहने की उम्मीद है, लेकिन अगर इसकी बात आती है तो मैं इसे एक शॉट दूंगा। –

1

मुझे लगता है कि आपने समस्या की पहचान की है लेकिन किसी ने इसका उल्लेख नहीं किया है। "डबल हॉप" मुद्दा आपको ऐसा करने की अनुमति नहीं दे रहा है। यह मुमकिन नहीं है। ऐसे कई लोग हैं जिन्होंने इसके बारे में लिखा है जैसे कि Scott Forsyth

आप आईआईएस अपने पहली 'हॉप' ऊपर का उपयोग करता है एकीकृत प्रमाणीकरण का उपयोग कर सर्वर, को प्रमाणित करते हैं। जब आईआईएस नेटवर्क डिवाइस तक पहुंचने का प्रयास करता है, तो यह डबल या दूसरी हॉप होगा जो की अनुमति नहीं है। आईआईएस बदले में नहीं अगले नेटवर्क डिवाइस के लिए वे प्रमाणीकरण पर पारित कर सकते हैं, अन्यथा डेवलपर या व्यवस्थापक आपके साख का दुरुपयोग और उन्हें तरीके कि साइट आगंतुक उम्मीद नहीं की थी में इस्तेमाल कर सकते हैं।

इस गुमनाम उपयोग के साथ या बंद प्रतिरूपण के साथ नहीं होती है क्योंकि उस मामले में आईआईएस का ख्याल रखता है कि आप के सत्यापन और फिर इसे स्थानीय या नेटवर्क पहुँच के लिए एक अलग उपयोगकर्ता का उपयोग करता है। इसका मतलब है कि ऐप पूल पहचान या अनाम उपयोगकर्ता नेटवर्क कॉल को पहली हॉप के रूप में बना सकता है।

मुझे लगता है कि यह स्पष्ट है कि आप अपने कनेक्शन को पहले कनेक्शन से आगे नहीं पारित कर सकते हैं।

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

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