2011-12-06 18 views
9

मैं एएसपी.NET एमवीसी 3 एप्लिकेशन पर काम कर रहा हूं और मेरे पास उपयोगकर्ता तालिका है जो उपयोगकर्ता नाम और उनके पासवर्ड संग्रहीत करती है। मैंने एक अतिरिक्त ADUSername बनाया है (सक्रिय निर्देशिका का डोमेन/उपयोगकर्ता नाम स्टोर करता है)।एएसपी.NET एमवीसी 3 लॉगिन और विंडोज प्रमाणीकरण

मैं निम्न कार्य करने की कोशिश कर रहा हूँ:

  1. इंट्रानेट से आवेदन चल उपयोगकर्ता प्रवेश पृष्ठ नहीं देखना चाहिए। उनका डोमेन/उपयोगकर्ता नाम स्वचालित रूप से प्राप्त किया जाना चाहिए और ADUsername फ़ील्ड के विरुद्ध तुलना की जानी चाहिए।

  2. उपयोगकर्ता इंटरनेट से (स्थानीय नेटवर्क से बाहर) या उपयोगकर्ता को कोई ADUsername मान वाले एप्लिकेशन चलाते हैं: लॉगिन स्क्रीन देखना चाहिए और उन्हें लॉगिन करने के लिए मेरे कस्टम उपयोगकर्ता नाम और पासवर्ड फ़ील्ड का उपयोग करना चाहिए।

यह दृश्य स्टूडियो विकास सर्वर और बहुत मुश्किल IIS का उपयोग :)

मैं अपने Web.Config रूपों का उपयोग करने के लिए सेट के रूप में, मैं WindowsIdentity.GetCurrent() का उपयोग कर रहा का उपयोग कर बहुत आसान था। नाम पाने के लिए वर्तमान ADUSername और फिर, मैं उपयोगकर्ता और फॉर्म प्रमाणीकरण खोजने के लिए अपनी उपयोगकर्ता तालिका देखता हूं। SetAuthCookie उसे।

आईआईएस का उपयोग करना हमेशा APPPOOL \ ASP.NET v4.0 उपयोगकर्ता लौटा रहा है जो मुझे आवश्यक डोमेन/उपयोगकर्ता को प्रतिबिंबित नहीं कर रहा है।

कोई मदद?

+0

अभी भी कुछ मदद की प्रतीक्षा कर रहा है। वर्णन के अनुसार मुझे एक साथ काम करने के लिए फॉर्म और विंडोज प्रमाणीकरण की आवश्यकता है। – IoC

उत्तर

15

यह पूरा करने के लिए एक आसान काम नहीं है। आपके इंट्रानेट उपयोगकर्ता की विंडोज पहचान केवल आपके लिए उपलब्ध होगी जब आईआईएस में विंडोज प्रमाणीकरण सक्षम है, एक अज्ञात प्रमाणीकरण अक्षम है। जब उपयोगकर्ता का ब्राउज़र सर्वर हिट करता है, तो आईआईएस उपयोगकर्ता को सत्यापित करने के लिए एनटीएलएम चुनौती/प्रतिक्रिया प्रक्रिया करेगा। ध्यान दें कि यह चुनौती/प्रतिक्रिया वास्तव में केवल एक बार नहीं, प्रत्येक व्यक्तिगत HTTP अनुरोध पर होती है।

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

  1. रूपों प्रमाणीकरण के साथ उपयोगकर्ताओं को प्रमाणित करने के लिए अपने मुख्य वेब अनुप्रयोग सेट करें:

    एक संकर बनाने के लिए आपको करना होगा। इस तरह web.config सेट करें। अपनी खुद की मशीन कुंजी जेनरेट करें - इस कुकी साझा करने को सुनिश्चित करने के लिए महत्वपूर्ण है काम करता है

    <authentication mode="Forms"><forms loginUrl="~/Account/LogOn" timeout="2880" path="/" enableCrossAppRedirects="true" name=".ASPXFORMSAUTH" protection="All" /> 
    </authentication> 
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" /> <system.webServer> 
    <security> 
        <authentication> 
        <anonymousAuthentication enabled="true"/> 
        <windowsAuthentication enabled="false"/> 
        </authentication> 
    </security></system.webServer> 
    
  2. NTLM प्रमाणीकरण के लिए विशुद्ध रूप से उपयोग करने के लिए एक नया और अलग वेब अनुप्रयोग बनाएँ। यह तब मुख्य एप्लिकेशन पर रीडायरेक्ट करेगा। क्षमा करें, दो ऐप्स संयुक्त नहीं किए जा सकते हैं।

  3. एनटीएलएम वेब ऐप में, वेब बदलें।config प्रमाणीकरण मोड नीचे की तरह:

<authentication mode="Windows">  
    </authentication> 
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" 
       decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" /> 
<system.webServer> 
    .... 
    <security> 
     <authentication> 
     <windowsAuthentication enabled="true"/> 
     <anonymousAuthentication enabled="false"/> 
     </authentication> 
     <ipSecurity> 
     <!-- put whatever here to restrict to your LAN 
     <add ..../> 
     --> 
     </ipSecurity> 
    </security> 
    </system.webServer> 
  1. NTLM webapp में, नियंत्रक करता है एक बात - से उपयोगकर्ता नाम निकालने (WindowsPrincipal) Thread.CurrentPrincipal(); और फॉर्म प्रमाणीकरण कहते हैं। SetAuthCookie (..)। फिर मुख्य वेब ऐप पर रीडायरेक्ट करें। WindowsIdentity.GetCurrent() का उपयोग न करें क्योंकि यह प्रतिरूपण सक्षम किए बिना सटीक नहीं होगा [msdn.microsoft.com/en-us/library/ff647076.aspx देखें] जो आप

  2. का उपयोग नहीं करना चाहते हैं कैसिनी या आईआईएस एक्सप्रेस के तहत इनमें से किसी का परीक्षण नहीं कर सकता; आपको आईआईएस 7.5 का उपयोग करना होगा।

  3. गोटो आईआईएस 7.5 और "प्रमाणीकरण - बेनामी" और "प्रमाणीकरण - विंडोज" के लिए फ़ीचर प्रतिनिधिमंडल चालू करें।

  4. अपने फार्म आधारित एप्लिकेशन

  5. के लिए आईआईएस आवेदन बनाएं अधिकार अपने नव निर्मित फार्म एप्लिकेशन पर क्लिक करें और 'आवेदन जोड़ें'। अपने NTLM प्रमाणीकरण आवेदन करने के लिए पथ सेट करें, और NTLM प्रमाणीकरण देखने के लिए "IntranetAuthentication"

  6. रूपों प्रमाणीकरण के लिए ब्राउज़र का उपयोग http://localhost/YourSite में, और http://localhost/YourSite/IntranetAuthentication की तरह कुछ करने के लिए नाम तो passthru प्रमाणन मुख्य साइट पर वापस काम कर

आपकी कंपनी में, सीधे इंट्रानेट उपयोगकर्ता इंट्रानेट लॉगऑन का उपयोग करने के लिए। बाहरी रूप से हर कोई नियमित रूप से प्रमाणीकरण पृष्ठ का उपयोग करता है।

+0

मुझे बहुत छोटा नमूना चाहिए। कृपया आप मेरी मदद कर सकते हैं? – IoC

+0

यहां समाधान पोस्ट करने में बहुत अधिक शामिल है, मैंने आपके लिए यहां एक कामकाजी उदाहरण दिया है https://bitbucket.org/geoffreys/so-dual-win-forms-auth/ – geoffreys

+0

डॉन ने केवल आधा समाधान देखा प्रतिबद्ध। क्षमा करें आराम करने के लिए प्रतिबद्ध होगा - वैसे भी उन्हें आपको सही रास्ते पर क्या मिलना चाहिए – geoffreys

3

यदि आप मिश्रित प्रमाणीकरण का उपयोग कर रहे हैं तो आपको संदर्भ के माध्यम से एडी उपयोगकर्ता क्यों नहीं मिलता है?

context.Request.ServerVariables["LOGON_USER"] 
+0

कोई मूल्य नहीं लौटा रहा है! – IoC

+0

मुझे विश्वास है कि आईआईएस कॉन्फ़िगरेशन में कुछ गड़बड़ है। अगर आप एडी ऑथ रखना चाहते हैं तो अपनी साइट पर अनाम प्रमाणीकरण को बंद करना और विंडोज प्रमाणीकरण चालू करना सुनिश्चित करें। –

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