2012-09-14 4 views
10

एक कोड अंधा पल बीत रहा है।कौन सा सदस्यता प्रदाता web.config में संग्रहीत उपयोगकर्ताओं को लागू करता है?

ASP.NET 4.0।

Web.config:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <authentication mode="Forms"> 
     <forms name="DataViewer" loginUrl="login.aspx"> 
     <credentials passwordFormat="Clear"> 
      <user name="devuser" password="test" /> 
     </credentials> 
     </forms> 
    </authentication> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    </system.web> 

और एक लॉगिन नियंत्रण:

<asp:Login ID="login" runat="server" /> 

अगर मैं एक उपयोगकर्ता नाम और पासवर्ड दर्ज करें, और लॉग इन पर क्लिक करें, यह लटकी हुई है।

यदि मैं तोड़ता हूं, तो मैं कॉल स्टैक में देख सकता हूं कि login.AuthenticateUsingMembershipProvider()SqlMembershipProvider.ValidateUser() पर कॉल करने के बीच में है। इस परियोजना में कोई डेटाबेस परिभाषित या शामिल नहीं है, और मैंने यह निर्दिष्ट नहीं किया है कि SqlMembershipProvider का उपयोग किया जाना चाहिए।

तो मेरा सवाल यह है कि web.config के <credentials> तत्व में उपयोगकर्ता नाम और पासवर्ड का उपयोग करने के लिए एएसपी.NET प्राप्त करने के लिए मुझे किस सदस्यता प्रदाता का उपयोग करना चाहिए?

+0

हो सकता है क्योंकि डिफ़ॉल्ट सदस्यता प्रदाता AspNetSqlProvider है जो SQL सर्वर डेटाबेस का उपयोग अपने उपयोगकर्ता स्टोर के रूप में करता है। – Scorpio

+0

मुझे उम्मीद है कि यह एक अस्थायी समाधान है। Web.config में प्रमाण-पत्र बनाए रखना बहुत मुश्किल हो जाएगा क्योंकि प्रत्येक परिवर्तन वेब एप्लिकेशन को पुनरारंभ करेगा। – jrummell

+0

बेशक। हालांकि यह परिदृश्य के लिए उपयुक्त है।मुझे एक ही उपयोगकर्ता (कभी) के लिए एक साधारण एप्लिकेशन को छोटी सुरक्षा प्रदान करने की आवश्यकता है जिसका पासवर्ड कभी नहीं बदलेगा। अधिक निर्भरता वाला समाधान उचित नहीं है। – tomfanning

उत्तर

14

मुझे आश्चर्य है कि फ्रेमवर्क डिजाइनर <credentials /> तत्व को परिभाषित करने की समस्या पर कैसे गए थे, उन्होंने उपभोग करने के लिए किसी भी कोड को लागू नहीं किया था।

मुझे इस here का एक प्रकार का कामकाज कार्यान्वयन मिला जो मैंने तय किया है और नीचे शामिल किया गया है। MembershipProvider के अन्य सभी सदस्यों NotImplementedException फेंक देते हैं।

using System.Configuration; 
using System.Web.Configuration; 
using System.Web.Security; 

public class WebConfigMembershipProvider : MembershipProvider 
{ 
    private FormsAuthenticationUserCollection _users = null; 
    private FormsAuthPasswordFormat _passwordFormat; 

    public override void Initialize(string name, 
     System.Collections.Specialized.NameValueCollection config) 
    { 
     base.Initialize(name, config); 
     _passwordFormat = getPasswordFormat(); 
    } 

    public override bool ValidateUser(string username, string password) 
    { 
     var user = getUsers()[username]; 
     if (user == null) return false; 

     if (_passwordFormat == FormsAuthPasswordFormat.Clear) 
     { 
      if (user.Password == password) 
      { 
       return true; 
      } 
     } 
     else 
     { 
      if (user.Password == FormsAuthentication.HashPasswordForStoringInConfigFile(password, 
       _passwordFormat.ToString())) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 

    protected FormsAuthenticationUserCollection getUsers() 
    { 
     if (_users == null) 
     { 
      AuthenticationSection section = getAuthenticationSection(); 
      FormsAuthenticationCredentials creds = section.Forms.Credentials; 
      _users = section.Forms.Credentials.Users; 
     } 
     return _users; 
    } 

    protected AuthenticationSection getAuthenticationSection() 
    { 
     Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); 
     return (AuthenticationSection)config.GetSection("system.web/authentication"); 
    } 

    protected FormsAuthPasswordFormat getPasswordFormat() 
    { 
     return getAuthenticationSection().Forms.Credentials.PasswordFormat; 
    } 
} 
+1

आप दोस्त रॉक! – sbeskur

+0

आपका स्वागत है :-) – tomfanning

+0

मैं बहिष्कृत विधि प्रपत्र प्रमाणीकरण का उपयोग करने वाला था। प्रमाणीकरण। यहां कक्षा डालने के लिए धन्यवाद। – strider

3

आप इस के लिए अपने स्वयं के प्रदाता लिखने की ज़रूरत जा रहे हैं। यह एक बाहरी एक्सएमएल फ़ाइल के बजाय MSDN documentation में नमूना ReadOnlyXmlMembershipProvider लेने के लिए और उन और साख web.config से पढ़ने के लिए इसे बदलने के लिए, अपेक्षाकृत आसान होना चाहिए।

2

मुझे यकीन है कि अगर आप की कोशिश की है, लेकिन नहीं कर रहा हूँ ....

FormsAuthentication.Authenticate प्रभार में है क्या करना है कि आप के लिए (हालांकि यह अब पदावनत कर रहा है क्योंकि सिफारिश व्यवहार सदस्यता उपयोग करने के लिए है वस्तु)

MSDN से:

प्रमाणित विधि है कि आवेदन विन्यास फाइल की साख अनुभाग में जमा हो जाती है उपयोगकर्ता प्रमाणिकता की पुष्टि करता है। वैकल्पिक रूप से, आप उपयोगकर्ता प्रमाण-पत्रों को संग्रहीत करने के लिए ASP.NET सदस्यता का उपयोग कर सकते हैं और प्रमाण-पत्र सत्यापित करने के लिए ValidateUser को कॉल कर सकते हैं।

तुम भी सदस्यता प्रदाताओं (क्योंकि तब भी जब आप उन्हें अपने web.config पर घोषणा नहीं करते हैं, वे machine.config फ़ाइल से लिए गए हैं) को हटा सकते हैं

<membership> 
    <providers> 
     <remove name="AspNetSqlMembershipProvider"/> 
    </providers> 
    </membership> 
संबंधित मुद्दे