2010-03-30 22 views
12

मैं एक वेबसाइट का उपयोग फ्रंटेंड के रूप में कर रहा हूं और सभी उपयोगकर्ताओं को मानक एएसपी.NET सदस्यता-प्रदाता के साथ प्रमाणित किया जाता है। SQL-डेटाबेस के भीतर पासवर्ड "हैश" सहेजे जाते हैं।एएसपीनेट सदस्यता प्रदाता को मैन्युअल रूप से पासवर्ड कैसे बनाया गया है?

अब मैं प्रशासनिक कार्यों के साथ डेस्कटॉप-क्लाइंट लिखना चाहता हूं। अन्य चीजों के अलावा उपयोगकर्ता पासवर्ड रीसेट करने का एक तरीका होना चाहिए। मैं सहेजे गए सदस्यता-डेटा के साथ डेटाबेस तक पहुंच सकता हूं, लेकिन मैन्युअल रूप से पासवर्ड-नमक और -शैश कैसे बना सकता हूं? System.Web.Membership नेमस्पेस का उपयोग अनुचित प्रतीत होता है इसलिए मुझे यह जानना होगा कि नए पासवर्ड के नमक और हैश को मैन्युअल रूप से कैसे बनाया जाए।

विशेषज्ञों का कदम उठो! :)

+2

क्यों System.Web.Security अनुचित है

यहाँ एक सरल सांत्वना आवेदन है? नौकरी के लिए सही उपकरण की तरह लगता है। –

+0

मैं अपने एसक्यूएल डेटाबेस का उपयोग कर डेस्कटॉप-क्लाइंट एप्लिकेशन में सदस्यता प्रदाता शामिल नहीं कर सकता, क्या मैं कर सकता हूं? जब यह संभव हो तो आप सही हैं और मैं इन तरीकों का उपयोग कर सकता हूं ... लेकिन इसे कैसे कार्यान्वित किया जाए? – Anheledir

उत्तर

13

आप बिल्कुल एक सांत्वना या WinForms अनुप्रयोग के भीतर System.Web.Security उपयोग कर सकते हैं।

static void Main(string[] args) 
{ 
    MembershipProvider provider = Membership.Provider; 

    MembershipUser myUser = provider.GetUser("myUser", false); 

    if(myUser != null) provider.DeleteUser("myUser", true); 

    MembershipCreateStatus status; 

    myUser = provider.CreateUser("myUser", "password", "[email protected]", null, null, true, null, out status); 

    if (status != MembershipCreateStatus.Success) 
    { 
     Console.WriteLine("Could not create user. Reason: " + status.ToString()); 
     Console.ReadLine(); 
     return; 
    } 

    Console.WriteLine("Authenticating with \"password\": " + provider.ValidateUser("myUser", "password").ToString()); 

    string newPassword = myUser.ResetPassword(); 

    Console.WriteLine("Authenticating with \"password\": " + provider.ValidateUser("myUser", "password").ToString()); 
    Console.WriteLine("Authenticating with new password: " + provider.ValidateUser("myUser", newPassword).ToString()); 

    Console.ReadLine(); 
} 

और app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <connectionStrings> 
     <add name="MyConnectionString" connectionString="Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=True" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <system.web> 
     <membership defaultProvider="MyMembershipProvider"> 
      <providers> 
       <clear /> 
       <add name="MyMembershipProvider" 
        type="System.Web.Security.SqlMembershipProvider" 
        connectionStringName="MyConnectionString" 
        applicationName="MyApplication" 
        minRequiredPasswordLength="5" 
        minRequiredNonalphanumericCharacters="0" 
        requiresQuestionAndAnswer="false" /> 
      </providers> 
     </membership> 
    </system.web> 
</configuration> 
1

त्वरित गंदा विधि

Public Shared Function GetSaltKey() As String 
      Dim saltBytes() As Byte 
      Dim minSaltSize As Integer = 4 
      Dim maxSaltSize As Integer = 8 

      ' Generate a random number for the size of the salt. 
      Dim random As Random 
      random = New Random() 

      Dim saltSize As Integer 
      saltSize = random.Next(minSaltSize, maxSaltSize) 

      ' Allocate a byte array, which will hold the salt. 
      saltBytes = New Byte(saltSize - 1) {} 

      ' Initialize a random number generator. 
      Dim rng As RNGCryptoServiceProvider 
      rng = New RNGCryptoServiceProvider() 

      ' Fill the salt with cryptographically strong byte values. 
      rng.GetNonZeroBytes(saltBytes) 

      ' Convert plain text into a byte array. 
      Return Convert.ToBase64String(saltBytes) 
     End Function 

     Public Shared Function ComputeHash(ByVal password As String, ByVal salt As String) As String 

      Return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(salt & password, _ 
       System.Web.Configuration.FormsAuthPasswordFormat.SHA1.ToString) 
     End Function 

हालांकि, सदस्यता नाम स्थान सामान इस के लिए बनाया गया है साथ ही, भूल अर्द्धविराम

+0

अच्छी विधि लेकिन मानक एएसपी के समान नहीं है।नेट सदस्यता-प्रदाता का उपयोग कर रहा है - इस विधि के साथ एक नया पासवर्ड सेट करने के बाद उपयोगकर्ता अब लॉग-इन नहीं कर सका। वैसे भी धन्यवाद :) – Anheledir

+1

मैं इस कोड का उपयोग एक उत्पादन साइट (एक पुराना) पर एएसपीनेट सदस्यता प्रदाता के साथ कर रहा हूं, आप हैश और नमक कुंजी का पुन: उपयोग करते हैं और प्रत्येक प्रमाणीकरण की तुलना करते हैं, जहां सुरक्षा से प्राप्त होता है। पिक्य नहीं होना चाहिए, लेकिन आपके प्रश्न ने केवल नमक की गणना करने के लिए कहा है और मैन्युअल रूप से कुंजी है। –

1

कुछ समय हो गया है के बाद से मैं एएसपी के साथ tinkered किया है ने कहा नेट सदस्यता, लेकिन कुछ से संबंधित कुछ से निपटना याद रखें (उपयोगकर्ताओं के मौजूदा डेटाबेस के कारण चीजों को अनुकूलित करने के लिए आवश्यक)। उस प्रयास में मैंने विधियों को ओवरराइड किया (मौजूदा उपयोगकर्ता डीबी में एमडी 5 हैड पीडब्ल्यूएस था)।

तो एक ही "सोचा था की लाइन" में:

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

कह आप इस endpoint ....

सुरक्षित करने के लिए यदि उपरोक्त अपने स्वाद के लिए भी अधूरा है होगा कि बिना चला जाता है, यहाँ हैशिंग पुन: बनाने के लिए कुछ प्रयास के बारे में asp.net मंचों के लिए एक लिंक है .... मैं सही होने की पुष्टि नहीं कर सकते, लेकिन यह इसे बाहर का परीक्षण करने के लिए आसान होना चाहिए:

http://forums.asp.net/p/1336657/2899172.aspx

+0

आपके वेब-सेवा विचार के लिए धन्यवाद। आप सही हैं, सामान्य परिस्थितियों में मैं पूरी सदस्यता-थिंग को सेवा के माध्यम से उपलब्ध कराऊंगा। दुर्भाग्य से कंपनी-नीतियां इस तरह की वेब-सेवा की अनुमति नहीं दे रही हैं :( – Anheledir

15

मैं परावर्तक इस्तेमाल किया उन तरीकों नेट-फ्रेमवर्क आंतरिक उपयोग कर रहा है पर एक नज़र लेने के लिए। हो सकता है कि इसके लिए सार्वजनिक विधियां उपलब्ध हों लेकिन मुझे उन्हें नहीं मिला - यदि आप जानते हैं कि उपयोगकर्ता के रूप में उन आंतरिक तरीकों से पूछताछ कैसे करें, तो कृपया एक टिप्पणी छोड़ दीजिए! :)

यहाँ अनावश्यक शर्तों के बिना सरलीकृत स्रोत-कोड क्योंकि मैं केवल एक SHA1-हैश के रूप में पासवर्ड सांकेतिक शब्दों में बदलना चाहते हैं:

private string GenerateSalt() { 
    var buf = new byte[16]; 
    (new RNGCryptoServiceProvider()).GetBytes(buf); 
    return Convert.ToBase64String(buf); 
} 

private string EncodePassword(string pass, string salt) { 
    byte[] bytes = Encoding.Unicode.GetBytes(pass); 
    byte[] src = Convert.FromBase64String(salt); 
    byte[] dst = new byte[src.Length + bytes.Length]; 
    byte[] inArray = null; 
    Buffer.BlockCopy(src, 0, dst, 0, src.Length); 
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length); 
    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); 
    inArray = algorithm.ComputeHash(dst); 
    return Convert.ToBase64String(inArray); 
} 
+8

प्रतिबिंबक का उपयोग करने की कोई आवश्यकता नहीं है, डिफ़ॉल्ट प्रदाताओं के लिए स्रोत आसानी से उपलब्ध है - http://download.microsoft.com/download/a/b/3 /ab3c284b-dc9a-473d-b7e3-33bacfcc8e98/ProviderToolkitSamples.msi। कार्यान्वयन के लिए SqlMembershipProvider के EncodePassword विधि पर नज़र डालें। यह डिफ़ॉल्ट हैश एल्गोरिदम का उपयोग करता है जब तक कि कोई सदस्यता प्रदाता के लिए निर्दिष्ट नहीं होता है। IIRC, डिफ़ॉल्ट SHA-1 है –

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