2010-10-26 15 views
18

मैं ASP.NET MVC आवेदन में निम्नलिखित कैसे लागू कर सकते हैं:एएसपी.नेट एमवीसी में फॉल-बैक के साथ एनटीएलएम प्रमाणीकरण का समर्थन कैसे करें?

  1. उपयोगकर्ता इंट्रानेट वेबसाइट
  2. उपयोगकर्ता चुपचाप यदि संभव हो तो प्रमाणित है
  3. यदि NTLM प्रमाणीकरण बाहर काम नहीं किया, उपयोगकर्ता के लिए शो लॉगिन प्रपत्र खोलता है
  4. उपयोगकर्ता पासवर्ड का चयन करें और डोमेन के लिए लॉग इन संकेत मिलता पूर्वनिर्धारित डोमेन की सूची
  5. उपयोगकर्ता ई
का उपयोग कर कोड में प्रमाणीकृत है से 210

मुझे पता है कि 4 और 5 को कैसे कार्यान्वित किया जाए लेकिन एनटीएलएम और रूपों को कैसे गठबंधन करने के बारे में जानकारी नहीं मिल सकती है। ताकि एनटीएलएम मूल लॉगिन/पासवर्ड संवाद कभी नहीं दिखाया जा सके - पारदर्शी प्रमाणीकरण या अच्छा दिखने वाला लॉगिन पृष्ठ।

काम कैसे करना चाहिए? क्या उपयोगकर्ता को लॉगिन और पासवर्ड से पूछा जाना चाहिए? क्या उसके वर्तमान प्रमाण-पत्र (डोमेन उपयोगकर्ता नाम) का उपयोग लॉगिन और पासवर्ड दर्ज करने के बिना किया जा सकता है? इन के लिए

अद्यतन, एक ही समस्या की जांच:

जब मैं इस पूछ रहा था मैं पूरी तरह से समझ में नहीं आता था कि कैसे NTLM प्रमाणीकरण आंतरिक रूप से काम करता है। समझने के लिए यहां महत्वपूर्ण बात यह है कि यदि उपयोगकर्ता का ब्राउज़र एनटीएलएम का सही ढंग से समर्थन नहीं करता है या यदि उपयोगकर्ता द्वारा सर्वर पर एनटीएलएम समर्थन अक्षम किया जाता है तो उसे कभी भी इसके आसपास काम करने का मौका नहीं मिलेगा।

कैसे Windows प्रमाणीकरण काम कर रहा है:

  1. क्लाइंट सर्वर के लिए एक नियमित रूप से HTTP अनुरोध भेजना
  2. सर्वर HTTP स्थिति 401 और संकेत है कि NTLM प्रमाणीकरण का उपयोग संसाधनों के लिए इस्तेमाल किया जाना चाहिए
  3. क्लाइंट NTLM भेजने के साथ प्रतिक्रिया टाइप 1 संदेश
  4. सर्वर चुनौती
  5. ग्राहक के साथ एनटीएलएम टाइप 2 संदेश के साथ प्रतिक्रिया करता है
  6. चुनौती के जवाब के साथ क्लाइंट टाइप 3 संदेश भेजता है
  7. सर्वर, वास्तविक सामग्री के

अनुरोध किया कि आप देख, ब्राउज़र का समर्थन नहीं NTLM (3), बजाय उपयोगकर्ता दिखाया जाएगा आईआईएस उत्पन्न त्रुटि कदम 401 पेज नहीं जाना होगा प्रतिक्रिया करता है।

यदि उपयोगकर्ता के पास प्रमाण पत्र नहीं हैं, तो NTLM प्रमाणीकरण पॉपअप संवाद विंडो ब्राउज़र को रद्द करने के बाद भी (3) जारी नहीं रहेगा।

इसलिए हमारे पास उपयोगकर्ताओं को कस्टम लॉगिन पृष्ठ पर स्वचालित रूप से रीडायरेक्ट करने का कोई मौका नहीं है।

यहां एकमात्र विकल्प "गेटवे" पृष्ठ होना है जहां हम निर्णय लेते हैं कि उपयोगकर्ता को एनटीएलएम का समर्थन करना चाहिए और यदि ऐसा है, तो एनटीएलएम संरक्षित होम पेज पर रीडायरेक्ट करें।

और यदि नहीं, तो लॉगिन फॉर्म दिखाएं और मैन्युअल रूप से लॉगिन और पासवर्ड दर्ज करके प्रमाणीकरण की अनुमति दें।

निर्णय आमतौर पर उपयोगकर्ताओं के आईपी पते और/या मेजबान नाम के आधार पर आईपी श्रेणियों से मिलान करके या पूर्वनिर्धारित आईपी की तालिका जांचकर किया जाता है।

+0

http में प्रदान की जाती के लिए एक लिंक है: // stackoverflow। कॉम/प्रश्न/492977/अज्ञात-पहुंच-और-एनटीएलएम-प्रमाणीकरण-इन-आईआईएस –

उत्तर

8

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

ASP.NET Mixed Mode Authentication

0

आप एक ही ASP.NET अनुप्रयोग में दोनों NTLM और FormsAuthentication नहीं हो सकता। आपको अलग वर्चुअल निर्देशिकाओं में दो अलग-अलग अनुप्रयोगों की आवश्यकता होगी।

+6

पूरी तरह से सच नहीं है - आप NTLM और प्रपत्र प्रमाणीकरण दोनों का समर्थन करने के लिए एक एप्लिकेशन (web.config का उपयोग करके) कॉन्फ़िगर नहीं कर सकते हैं, लेकिन ऐसा कोई कारण नहीं है कि आप क्यों नहीं कर सकते इसे संभालने के लिए कस्टम प्रमाणीकरण मॉड्यूल नहीं बनायेगा। – Keith

2

मेरे पास उत्पादन में यह सटीक सेटअप है, मैंने फॉर्म पोर्टल का उपयोग करने के लिए अपना पोर्टल सेटअप किया है और एक ऐसा फ़ंक्शन लिखा है जो विज़िटर आईपी को उस आईपी/पीसी में लॉग इन किए गए उपयोगकर्ता खाते को देखने के लिए लेता है। मुझे ढूंढने वाले नाम का उपयोग करना (उदाहरण के लिए DOMAIN\user), मैं सत्यापित करता हूं कि डोमेन मेरे डोमेन से मेल खाता है और उपयोगकर्ता नाम/खाता Membership.GetUser(<user>) का उपयोग करके मेरे फॉर्म एथ प्रदाता में मान्य है। यदि यह कॉल एक मैच देता है और उपयोगकर्ता IsApproved उपयोगकर्ता के लिए FormsAuthenticationTicket & कुकी बनाता है। मेरे पास नेटवर्क पर 400+ लोग हैं और यह पूरी तरह से काम करता है, जो अभी भी लॉगिन करने वाले कंप्यूटर हैं (1. मेरे पोर्टल में खातों के बिना उपयोगकर्ता, 2. कुछ मैक/लिनक्स उपयोगकर्ता, 3. मोबाइल उपयोगकर्ता जिन्होंने नेटवर्क पर बूट नहीं किया और समूह नीति ने फ़ायरवॉल को उच्च करने में सक्षम किया था)।

इस समाधान करने के लिए पकड़ है कि यह एक डोमेन व्यवस्थापक खाता उपयोगकर्ताओं पीसी क्वेरी करने के लिए की प्रतिरूपण की आवश्यकता है, और आप अप्रबंधित कोड NetApi32.DLL का उपयोग करता है।

यहां कोड है जिसका उपयोग मैं करता हूं (बाहरी फ़ंक्शन कॉल प्रदान नहीं किया जाता है)। मैंने इसे थोड़ा सा सरल बनाने की कोशिश की है, क्योंकि बाहरी कॉल के बहुत सारे हैं।

string account = String.Empty; 
string domain = String.Empty; 
string user = String.Empty; 


ImpersonateUser iu = new ImpersonateUser(); //Helper that Enabled Impersonation 
if (iu.impersonateValidUser(StringHelper.GetAppSetting("DomainAccount"), StringHelper.GetAppSetting("DomainName"), StringHelper.GetEncryptedAppSetting("DomainAccountPassword"))) 
{ 
    NetWorkstationUserEnum nws = new NetWorkstationUserEnum(); //Wrapper for netapi32.dll (Tested on Vista, XP, Win2K, Win2K3, Win2K8) 
    string host = nws.DNSLookup(Request.UserHostAddress); // netapi32.dll requires a host name, not an IP address 

    string[] users = nws.ScanHost(host); // Gets the users/accounts logged in 

    if (nws.ScanHost(host).Length > 0) 
    { 
     string workstationaccount = string.Empty; 

     if (host.IndexOf('.') == -1) // Pick which account to use, I have 99.9% success with this logic (only time doesn't work is when you run a interactive process as a admin e.g. Run As <process>). 
     { 
      workstationaccount = String.Format("{0}\\{1}$",StringHelper.GetAppSetting("DomainName"), host).ToUpper(); 
     } 
     else 
     { 
      workstationaccount = String.Format("{0}\\{1}$", StringHelper.GetAppSetting("DomainName"), host.Substring(0, host.IndexOf('.'))).ToUpperInvariant(); 
     } 

     account = users[users.Length - 1].Equals(workstationaccount) ? users[0] : users[users.Length - 1]; 

     domain = account.Substring(0, account.IndexOf("\\")); 
     user = account.Substring(account.IndexOf("\\") + 1, 
           account.Length - account.IndexOf("\\") - 1); 
    } 

    iu.undoImpersonation(); // Disable Impersonation 
} 

अब खाते हम पहले समारोह/प्रक्रिया में पकड़ा का उपयोग कर, अब हम को सत्यापित करने और तय करने के लिए अगर हम एक लॉगिन दिखाना चाहिए या ऑटो के लिए लॉग इन उपयोगकर्ता का प्रयास करें।

MembershipUser membershipUser = Membership.GetUser(user); 

if (membershipUser != null && membershipUser.IsApproved) 
{ 
    string userRoles = string.Empty; // Get all their roles 
    FormsAuthenticationUtil.RedirectFromLoginPage(user, userRoles, true); // Create FormsAuthTicket + Cookie + 
} 

मैं एक लंबे समय पहले इस बारे में एक ब्लॉग पोस्ट में लिखा था, यहाँ NetApi32.DLL के लिए आवरण और मेरे प्रतिरूपण सहायक है कि मैं पद Source Code Download

+1

आपकी विस्तृत प्रतिक्रिया के लिए धन्यवाद, मैं इसे उत्तर के रूप में चिह्नित नहीं कर रहा हूं, क्योंकि मुझे लगता है कि इसे सुरक्षा के साथ चिंता हो सकती है और कुल मिलाकर 'हैक' महसूस होता है :-) –

+1

यह निश्चित रूप से एक हैक है .. – Zachary

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