2013-02-01 54 views
5

मेरे पास 2 एएसपी.नेट एमवीसी 3 अनुप्रयोग हैं। मैं web.config के माध्यम से प्रतिरूपण का उपयोग कर रहा हूं ताकि उपयोगकर्ता पर विवरण प्राप्त करने के लिए मुझे सक्रिय निर्देशिका से पूछने की अनुमति मिल सके। एप्लिकेशन विंडोज प्रमाणीकरण का उपयोग करता है और अज्ञात उपयोगकर्ताओं को अनुमति नहीं देता है। एक आवेदन प्राथमिक एप्लिकेशन है जहां उपयोगकर्ता अपना कार्य करता है। दूसरा उपयोगकर्ता को एप्लिकेशन में एक जैसा दिखने के लिए अन्य उपयोगकर्ता की स्थापना करने की अनुमति देता है।प्रतिरूपण, सक्रिय निर्देशिका, और "उपयोगकर्ता के पास xxxx का अधिकार नहीं है" मुद्दे

परीक्षण उपयोगकर्ता के निम्न त्रुटि हो रही है:

SQL1092N "<DOMAIN ID>" does not have the authority to perform the requested command. 

यह तब होता है के बाद मैं माध्यमिक एक के लिए मेरी प्राथमिक आवेदन से एक वेब अनुरोध भेजें। उस काम को पाने के लिए मुझे अनुरोध को वास्तविक उपयोगकर्ता का प्रतिरूपण करना था, न कि आवेदन प्रतिरूपण के लिए उपयोग की जाने वाली पहचान। यह वास्तव में एक एसओ सवाल है जिसे मैंने पोस्ट किया था और जवाब दिया था। यही कारण है कि यहाँ है: How do I call an MVC Action via a WebRequest and validate the request through Active Directory?

कि कोड के अंत में, मैं फोन:

impersonationContext.Undo(); 

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

मेरा सवाल है, मैं web.config में उपयोगकर्ता को वापस लौटने के लिए एप्लिकेशन का प्रतिरूपण कैसे प्राप्त कर सकता हूं? या, मेरा वेब अनुरोध करते समय, यह सुनिश्चित करने का कोई तरीका है कि प्रतिरूपण संदर्भ केवल उस अनुरोध पर लागू होता है?

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

मैं किसी भी विचार, टिप्पणियां, सुझाव, और/या आलोचना के लिए खुला हूं। मुझे इसे संभालने के बारे में कैसे जाना चाहिए?

+0

क्या ऐसी कोई चीज है जिसे मुझे स्पष्ट करने की आवश्यकता है? जिस तरह से सवाल रास्ते में हो रहा है? प्रतिक्रिया का स्वागत किया। मुझे जहां कहीं भी संभव हो, फिर से लिखना या स्पष्ट करना नहीं है। – jason

उत्तर

1

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

  proxyRequestResultDetails = ProxyApiWrapper.GetProxies(
       adUserInfo.AssociateId, 
       context.User); 

इस कोड को एक प्राधिकरण फिल्टर विशेषता के आधार पर कहा जा रहा है:

मैं अपने एपीआई पुस्तकालय के लिए निम्न फोन है। विधि प्रोटोटाइप लग रहा है

public void OnAuthorization(AuthorizationContext filterContext)  

आंतरिक रूप से, कॉल GetProxies विधि निम्नलिखित कॉल करता है जैसे:

 public static StreamReader GetWebRequestStream(
      string url, 
      string contentType, 
      bool useDefaultCredentials, 
      IPrincipal user) 
     { 

      var impersonationContext = ((WindowsIdentity)user.Identity).Impersonate();    
      var request = WebRequest.Create(url); 

      try 
      { 
       request.ContentType = contentType; 
       //request.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 
       //request.UseDefaultCredentials = useDefaultCredentials;    
       //IWebProxy p = new WebProxy(); 
       //request.Proxy = p. 
       request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested; 
       request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 
       var response = (HttpWebResponse)request.GetResponse(); 
       return new StreamReader(response.GetResponseStream()); 
      } 
      catch (Exception e) 
      { 
       impersonationContext.Undo(); 
       throw e; 
      } 
      finally 
      { 
       impersonationContext.Undo(); 
      } 

     } 

जब बुला विधि रिटर्न, उपयोगकर्ता की पहचान नहीं रह गया है के लिए एक सेट की है कि आवेदन प्रतिरूपण। फिक्स बहुत आसान है:

  //Track current identity before proxy call 
      IPrincipal user = context.User; 
      proxyRequestResultDetails = ProxyApiWrapper.GetProxies(
       adUserInfo.AssociateId, 
       context.User); 

      //Undo any impersonating done in the GetProxies call 
      context.User = user;  

कोड की 2 पंक्तियां सिर दर्द के 12 घंटे हल हो गईं। यह और बुरा हो सकता था। किसी भी तरह। एक ध्वनि बोर्ड होने के लिए धन्यवाद। मैंने को बतख के साथ इस रूपांतरण के साथ प्रयास किया, लेकिन बतख उलझन में आया।