2013-02-14 40 views
11

जब मैं कोशिश करते हैं और मेरी नव तैनात (lcoal IIS करने के लिए 7.5) MVC4 ऐप्स को एक्सेस, मैं त्रुटि मिलती है।

web.config में कनेक्शन स्ट्रिंग इस तरह दिखता है:

<add name="ComairRIEntities" 
    connectionString="metadata=res://*/Data.ComairRI.csdl|res://*/Data.ComairRI.ssdl|res://*/Data.ComairRI.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(local);initial catalog=MyDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 
    providerName="System.Data.EntityClient" /> 

उत्तर

8

यह क्या हो रहा है यह है:

अपने कनेक्शन स्ट्रिंग में आप निम्न सेटिंग है: एकीकृत सुरक्षा = सच इसका मतलब है कि SQL सर्वर कनेक्शन के साथ प्रमाणित हो जाएगा प्रक्रिया की प्रमाणीकरण जो कनेक्शन शुरू करती है। चूंकि आप आईआईएस और आईआईएस के तहत चल रहे हैं, एप्लिकेशन पूल का उपयोग करते हैं, इसलिए कनेक्शन को विंडोज उपयोगकर्ता के साथ प्रमाणित किया जाएगा जो एप्लिकेशन पूल चलाता है। डिफ़ॉल्ट रूप से यह एक उपयोगकर्ता है जिसे नेटवर्क सेवा नामक लगभग अनुमति नहीं है। नेटवर्क सेवा (या शायद IIS7.5 में यह एक अलग है) आपके डेटाबेस के लिए कभी भी अधिकार नहीं होगा। आपके विशेष परिदृश्य की बारीकियों थोड़ा अलग हो सकती है क्योंकि आईआईएस में विभिन्न सुरक्षा विरासतों का एक गुच्छा है और आपकी प्रक्रिया समाप्त होने वाले विभिन्न उपयोगकर्ताओं का समूह है, हालांकि, मूल समस्या यह है कि आपके पास एकीकृत सुरक्षा = True है और उपयोगकर्ता आईआईएस प्रक्रिया के साथ चल रहा है एक मानक उपयोगकर्ता के साथ लगभग कोई अधिकार नहीं है।

  1. बदलें एकीकृत सुरक्षा = उपयोगकर्ता नाम \ पासवर्ड प्रमाणीकरण के लिए यह सच है:

    आप कुछ ही विकल्प हैं ठीक करने के लिए। यह 100% हल करेगा, लेकिन हो सकता है कि आप web.config फ़ाइल में अपना पासवर्ड स्पष्ट टेक्स्ट स्टोर न करना चाहें।

  2. अपनी आईआईएस आभासी निर्देशिका सेटिंग्स में, अज्ञात उपयोगकर्ता को एक सार्थक होने के लिए कॉन्फ़िगर करें जिसमें आपके डीबी तक पहुंच अधिकार हैं। यह अंततः मदद करेगा, लेकिन आपको इसे सही करने के लिए अलग-अलग सेटिंग्स के साथ खेलना होगा।

    1. AppPool
    2. वर्चुअल निर्देशिका की पहचान और के सभी प्रमाणन सेटिंग्स की पहचान:

    आप # 2 के साथ और अधिक मदद की जरूरत है, तो आप निम्नलिखित जानकारी प्रदान करने के लिए है आभासी निर्देशिका।

1

आप यकीन है कि यह थोड़ा & quot की जरूरत है कि कर रहे हैं?

provider connection string=&quot 

क्या यह स्ट्रिंग के बाकी हिस्सों की तरह ही एक उद्धरण चिह्न नहीं होना चाहिए?

स्ट्रिंग के अंत में भी एक है।

+0

कनेक्शन स्ट्रिंग ईएफ द्वारा उत्पन्न की जाती है, और यह सभी तैनाती के लिए समान है। जब यह सब कुछ में काम करता है, तो मुझे संदेह है कि एक खूनी उद्धरण समस्या है। – ProfK

+0

@ProfK ठीक है यह केवल एकमात्र चीज थी जिसे मैं इसके साथ गलत देख सकता था –

+2

यह गलत नहीं है। मैंने web.config फ़ाइल से संपूर्ण ईएफ कनेक्शन स्ट्रिंग को उद्धृत किया। यह '"' का उपयोग करता है ताकि एक वास्तविक "कनेक्शन स्ट्रिंग के हिस्से के रूप में संग्रहीत किया जा सके और इसे समाप्त नहीं किया जा सके। – ProfK

1

यह स्थानीय उपयोगकर्ता खाता है कि ऐप पूल पहचान स्वयं SQL सर्वर से कनेक्ट होने पर प्रकट होती है। नेटवर्क सेवा का उपयोग करने और अपने डेटाबेस में नेटवर्क सेवा अनुमति देने के लिए ऐप पूल को बदलने का प्रयास करें या डेटाबेस को IUSR_YOUR-MACHINE अनुमति दें। चूंकि आप स्थानीय रूप से काम कर रहे हैं, तो आपके स्थानीय डेटाबेस के नेटवर्क सेवा db_owner को बनाना आसान हो सकता है। स्पष्ट रूप से उत्पादन में ऐसा करने के साथ सुरक्षा मुद्दे हैं!

3

इस प्रश्न में बहुत अच्छी जानकारी है: Login failed for user 'DOMAIN\MACHINENAME$'

If you see a failure like Login failed for user 'DOMAIN\MACHINENAME$' it means that a process running as NETWORK SERVICE or as LocalSystem has accessed a remote resource, has authenticated itself as the machine account and was denied authorization.

यहाँ क्या अजीब लगता है कि आप अभी भी एक स्थानीय डेटाबेस का उपयोग करने की कोशिश कर रहे हैं, फिर भी DOMAIN\MACHINENAME$ के एक उपयोगकर्ता नाम का तात्पर्य है कि यह एक गैर स्थानीय डेटाबेस तक पहुँच रहा है है।

क्या आप निश्चित रूप से पोस्ट की गई कनेक्शन स्ट्रिंग का उपयोग करते हैं?

दूसरी चीज जो आप देख सकते हैं वह आपकी साइट पर चल रहे एप्लिकेशन पूल के लिए एक विशिष्ट उपयोगकर्ता खाता बना रही है - इसे संभवतः पढ़ने और अनुमतियों को लिखने की आवश्यकता होगी।

उपयोगकर्ता खाता का प्रकार आपके पर्यावरण पर निर्भर करेगा: यदि आप किसी डोमेन के भीतर चल रहे हैं, तो आप एक डोमेन उपयोगकर्ता बना सकते हैं और अपने कनेक्शन स्ट्रिंग में integrated security=True का उपयोग करना जारी रख सकते हैं, या यदि आप SQL प्रमाणीकरण का उपयोग करके जांच नहीं कर सकते हैं।

संपादित करें:

मैं इस सटीक त्रुटि एक बार किया था, लगभग ठीक ही बात कर। मेरे मामले में डेटाबेस एक अलग सर्वर पर था (यानी, वही मशीन नहीं जैसा कि यह आपके मामले में प्रतीत होता है), लेकिन समाधान यह था:

  1. एक डोमेन खाता बनाएं।
  2. इसे SQL प्रबंधन स्टूडियो में सुरक्षा \ लॉग इन और सुरक्षा \ उपयोगकर्ताओं में जोड़ें।
  3. एसक्यूएल प्रबंधन स्टूडियो में db_datareader और db_datawriter भूमिका सदस्यता प्रदान करें।
  4. वेब सर्वर पर, aspnet_regiis -ga domain\account_name
  5. इस खाते को अज्ञात पहुंच के लिए उपयोग करने के लिए सेट करें।
  6. इस वेब एप्लिकेशन के लिए एक नया एप्लिकेशन पूल बनाएं।
  7. इस खाते के लिए एप्लिकेशन पूल की पहचान सेट करें।

ध्यान दें कि यह आईआईएस 6 के लिए था, इसलिए यदि आप IIS में हैं 7+ आप चरण 4, 5 और 6

1

आवश्यकता नहीं होती है पहचान है कि आपके अनुप्रयोग के लिए AppPool में के तहत चल रहा है की जाँच करें आईआईएस प्रबंधक। यह शायद AppPoolIdentity होगा। फिर जांचें कि आपने उस पहचान के लिए SQL सर्वर में लॉगिन बनाया है, यह आपके डेटाबेस में मैप किया गया है और इसमें एप्लिकेशन द्वारा आवश्यक आवश्यक भूमिका सदस्यता/अनुमतियां हैं। पहचान नाम "आईआईएस ऐपपूल \ [AppPoolName]" होगा। (अधिक जानकारी के लिए http://www.iis.net/learn/manage/configuring-security/application-pool-identities देखें)।

यदि यह काम नहीं करता है, तो कृपया प्रतिरूपण सक्षम है या नहीं, जिसमें आपके एप्लिकेशन डेटाबेस कनेक्शन कॉन्फ़िगर किए गए तरीके की व्याख्या करें।

2

ध्यान देने योग्य एक बात यह है कि DOMAIN\MACHINE-NAME$ डोमेन पर मशीन के प्रमाण-पत्रों का प्रतिनिधित्व करने के लिए उपयोग किया गया वाक्यविन्यास है। आपके पास उपयोगकर्ता खाता कैसा है, इसके अलावा एक मशीन खाता भी है जो लगभग समान है (अनुमतियों को छोड़कर काफी अलग हैं)।

चूंकि आपको DOMAIN\MACHINE-NAME$ मिल रहा है, तो आपके पास प्रतिरूपण समस्या नहीं है। ऐसा करने के लिए सबसे पहले यह देखने के लिए एप्लिकेशन पूल को देखना है कि यह किस पहचान के रूप में चल रहा है।

आप आईआईएस प्रबंधक खोलकर और एप्लिकेशन पूल का चयन करके ऐसा कर सकते हैं। अगला एप्लिकेशन पूल का चयन करें और दाईं ओर "एप्लिकेशन देखें" पर क्लिक करें, यह आपको सत्यापित करने की अनुमति देता है कि सबकुछ ठीक से सेटअप है।

  • ApplicationPoolIdentity
  • :

    इसे सही ढंग से कॉन्फ़िगर किया गया है उसके बाद "उन्नत सेटिंग ...", "प्रक्रिया मॉडल" शीर्षक एक "पहचान" क्षेत्र है के तहत, यह निम्न में से एक होना चाहिए

  • LocalService
  • स्थानीय सिस्टम
  • NetworkService
  • डोमेन \ खाता

यदि यह ApplicationPoolIdentity है, तो यह अपेक्षा की जाती है कि आप अपेक्षा करते हैं, अगर यह एक गैर-कस्टम एक अन्यथा है, तो आपको लगता है कि आप DOMAIN\MACHINE-NAME$ प्राप्त कर सकते हैं। यह एक कस्टम खाता संदिग्ध है क्योंकि वह उस खाते के रूप में दिखाई देगा।

यदि यह ApplicationPoolIdentity है और SQL मशीन एक ही मशीन पर नहीं है (या संभावित रूप से यदि आप होस्ट नाम या आईपी पता का उपयोग करते हैं) तो आपको DOMAIN\MACHINE-NAME$ मिल सकता है क्योंकि यह ApplicationPoolIdentity का नेटवर्क प्रमाण-पत्र है। ApplicationPoolIdentity स्थानीय पहुंच के लिए IIS AppPool\ApplicationPool का उपयोग करता है, लेकिन DOMAIN\MACHINE-NAME$ दूरस्थ पहुंच के लिए, क्योंकि पूर्व केवल स्थानीय रूप से उपलब्ध है।

यह भी सुनिश्चित करें कि आप वास्तव में उस सटीक कनेक्शन स्ट्रिंग का उपयोग कर रहे हैं, जिन कारणों से मैंने ऊपर तक पहुंचने के तरीके को विस्तृत किया है।

यदि यह इसे हल नहीं करता है, तो यह आपकी सहायता करेगा यदि आपने यह निर्धारित किया है कि आपने जो पहचान सेट की है, और क्या एएसपी.Net प्रतिरूपण सक्षम है।

1

मैं निम्नलिखित की समीक्षा करूंगा।

"डेटा स्रोत = (स्थानीय)" के बजाय कंप्यूटर नाम का उपयोग करें जहां डेटाबेस रहता है। यह सुनिश्चित करने के लिए कि DNS सही है, DNS रिज़ॉल्यूशन जांचें।

सुनिश्चित करें कि जिस उपयोगकर्ता के पास एप्लिकेशन पूल चल रहा है उसे डेटाबेस सर्वर से कनेक्ट करने की अनुमति है।

1

आपको लॉगिन के रूप में एसक्यूएल सर्वर में ऐप पूल पहचान जोड़ने की आवश्यकता है। इस पढ़ें: http://www.iis.net/learn/manage/configuring-security/application-pool-identities-and-sql-server-express

+0

ऐप पूल और मशीन पहचान समान नहीं है। यह एसक्यूएल में * मशीन * पहचान के रूप में लॉग इन करने का प्रयास कर रहा है – ProfK

+0

@ProfK हालांकि हमारे लॉग लॉगिन त्रुटियों में मशीन पहचान दिखा रहे थे, जब हमने पूल पहचान को जोड़ा तो यह वास्तव में काम करता था। – julealgon