2012-01-10 18 views
18

चूंकि इस प्रक्रिया पर दस्तावेज़ बहुत अस्पष्ट और भ्रमित (या पुराना) है, इसलिए मैं यह सत्यापित करना चाहता था कि मैं इसे सही तरीके से कर रहा हूं और किसी भी चरण को याद नहीं कर रहा हूं।प्रपत्र प्रमाणीकरण समझ संदर्भ.user.identity

मैं एक सुरक्षित लॉगिन सिस्टम बनाने की कोशिश कर रहा हूं, जो ब्राउज़र-बंद होने पर समाप्त हो जाता है।

<asp:Button ID="LoginButton" runat="Server" OnClick="Login_Authenticate" Text="Sign in" /> 

अंदर Login_Authenticate मुझे क्या करना:

-

<authentication mode="Forms"> 
     <forms loginUrl="~/Login.aspx" defaultUrl="Index.aspx" name=".ASPXFORMSAUTH" timeout="100" /> 
    </authentication> 
    <authorization> 
     <allow users="?" /> 
    </authorization> 
    <machineKey decryption="AES" validation="SHA1" validationKey.......... /> 

तो मैं और उपयोगकर्ता नाम/पासवर्ड पाठ बॉक्स के साथ एक लॉगिन प्रपत्र इस बटन है - मेरी web.config में मैं निम्नलिखित है निम्नलिखित:

protected void Login_Authenticate(object sender, EventArgs e){ 
string userName = UserName.Text; 
string password = Password.Text; 

bool Authenticated = false; 

// Here's code that makes sure that Username and Password is CORRECT 
if(AuthClass.Authenticate(userName, password)){ 
Authenticated = true; 
} 
// error checking does happen here. 

if (Authenticated) 
{ 
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(30), rememberUserName, String.Empty, FormsAuthentication.FormsCookiePath); 
    string encryptedCookie = FormsAuthentication.Encrypt(ticket); 
    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedCookie); 
    cookie.Expires = DateTime.Now.AddMinutes(30); 
    Response.Cookies.Add(cookie); 
    //FormsAuthentication.RedirectFromLoginPage(userName, false); 

    Response.Redirect("MainPage.aspx"); 
} 
} 

--- MasterPage.master.cs में मैं Page_Init में निम्नलिखित की जांच की है () ---

if (Context.User.Identity.IsAuthenticated) 
    { 
     int userid = (int)Session["userid"]; 
     if (userid == null) 
     { 
     userid = GetUserID(Context.User.Identity.Name); 
     if (userid != null) 
     { 
      Session["userid"] = userid; 
     } 
     } 
    } 

संपादित करें: --- Global.asax; कुछ कोड है कि मैं काफी यकीन नहीं कर रहा हूँ सही है या पता है कि यह

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
    { 
     // look if any security information exists for this request 
     if (HttpContext.Current.User != null) 
     { 
      // see if this user is authenticated, any authenticated cookie (ticket) exists for this user 
      if (HttpContext.Current.User.Identity.IsAuthenticated) 
      { 
       // see if the authentication is done using FormsAuthentication 
       if (HttpContext.Current.User.Identity is FormsIdentity) 
       { 
        // Get the roles stored for this request from the ticket 
        // get the identity of the user 
        FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity; 
        //Get the form authentication ticket of the user 
        FormsAuthenticationTicket ticket = identity.Ticket; 
        //Get the roles stored as UserData into ticket 
        string[] roles = { }; 
        //Create general prrincipal and assign it to current request 

        HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(identity, roles); 
       } 
      } 
     } 
    } 

--- तब से हर पृष्ठ पर, मैं सत्र userid का उपयोग उपयोगकर्ता की जानकारी और सामग्री इकट्ठा करने और यह सुनिश्चित करने के लिए करता है उपयोगकर्ता के पास उचित प्रमाणीकरण और समूह-भूमिका अनुमतियां हैं।

क्या यह सब सही है? या मुझे कहीं और कुछ डिक्रिप्ट करना है?

क्या यह एक सुरक्षित उपयोगकर्ता लॉगिन बनाने के लिए पर्याप्त है? या क्या मुझे फॉर्म प्रमाणीकरण से परेशान नहीं होना चाहिए और अपनी खुद की कुकीज़ बनाने और इसे स्वयं प्रबंधित करने का अपना तरीका ढूंढना चाहिए?

+0

क्या हुआ अगर कोड हमेशा प्रमाणीकृत विफल रहता है प्रमाणीकृत = false bool सच रिटर्न; // यहां कोड है जो सुनिश्चित करता है कि उपयोगकर्ता नाम और पासवर्ड सही प्रमाणीकृत = सत्य है; यह आपके पास शीर्ष पर है .. लेकिन यदि कोड विफल रहता है तो यह कभी भी प्रमाणीकृत को गलत पर सेट नहीं करता है .. – MethodMan

+0

@DJKRAZE कोड त्रुटियों पर गलत होने पर सेट करता है। मैंने उपयोगकर्ता नाम/पासवर्ड की जांच के लिए अभी तक लंबा कोड शामिल नहीं किया है। प्रमाणीकृत = सत्य केवल तभी होता है जब सब कुछ सफल हो। – Dexter

+0

स्पष्टीकरण के लिए कुछ और कोड जोड़ा गया है और मेरे ग्लोबल.एक्सएक्स कोड का उपयोग कर रहा हूं। मुझे नहीं पता कि यह काम कर रहा है और मैं बहुत उलझन में हूं। – Dexter

उत्तर

12

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

1) लॉगिन:

कुकी आधारित प्रमाणीकरण तरीकों के लिए, वहाँ वास्तव में तीन कार्यों कर रहे हैं।

2) लॉगआउट - बस ब्राउज़र से कुकी (कुकी समाप्त हो रही करने या हटाने)

3) प्रति अनुरोध मान्यता से निकाल देता है (भाग है कि आपके Application_AuthenticateRequest है) - अगर एक कुकी मौजूद है देखने के लिए जाँच , और यदि ऐसा है, तो उपयोगकर्ता की पहचान और भूमिकाएं प्राप्त करें और HttpContext.Current.User सेट करें।

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

आपकी लॉगिन_ प्रमाणीकरण विधि ठीक दिखती है इसके अलावा आप एक समाप्ति सेट कर रहे हैं कुकी। यह कुकी को तब तक बनाए रखेगी जब आप ब्राउज़र को बंद और फिर से खोलें। चूंकि यह वह व्यवहार नहीं है जिसे आप चाहते हैं, इसलिए मैं कुकी की समाप्ति सेट नहीं करूँगा। इसे सेट करना "मुझे याद रखें" चेकबॉक्स की जांच करना है।

Application_AuthenticateRequest में कोड हर बार एक पृष्ठ आपके आवेदन से परोसा जाता है चलाने के हो जाता है। यह प्राथमिक कार्य HttpContext.Current.User स्थापित करने के लिए है। आमतौर पर, यदि कोई उपयोगकर्ता के प्रवेश, उपयोगकर्ता या तो शून्य या एक अनाम उपयोगकर्ता है। एक उपयोगकर्ता हैं लॉग इन है, यह अपने उपयोगकर्ता का प्रतिनिधित्व करना चाहिए।

आप इन तीन चीज़ें कर रहे हैं, तो अपने कोड में कहीं भी आप HttpContext.Current.User संदर्भ जानकारी का स्तर क्या आप प्रदर्शित करना चाहते तय करने के लिए कर सकते हैं। उदाहरण के लिए, यदि आप केवल प्रशासकों के लिए एक पेज प्रतिबंधित करना चाहते हैं, तो आप HttpContext.Current.Users.IsInRole कह सकते हैं ("व्यवस्थापक"), और कॉल झूठी वापस लौट आता है उन्हें दूर पेज से अनुप्रेषित।

उम्मीद है कि इससे मदद मिलती है।

+0

मैं देखता हूं। मैं अपने आप के साथ संघर्ष कर रहा था कि कुकीज़ का उपयोग करना और जारी रखना है या ब्राउज़र बंद होने पर सत्र समाप्त करना है या नहीं। मैं अभी भी तय नहीं कर सकता कि मुझे सुरक्षा या सुविधा के लिए जाना चाहिए या नहीं। --- तो Application_AuthenticateRequest में कोड करता है, क्या यह सब कुछ के साथ काम करता है? मुझे अपने कोड में कहीं भी कुकी को डिक्रिप्ट या कुछ भी नहीं करना है? फॉर्म्स प्रमाणीकरण छुपाओं से आपका क्या मतलब है, यह वास्तव में क्या छिपाता है और मुझे फॉर्म प्रमाणीकरण टिकट का उपयोग क्यों नहीं करना चाहिए? मैं Current.Users में भूमिकाओं का उपयोग नहीं करना चाहता क्योंकि मैं किसी भी विशिष्ट भूमिका प्रणाली के लिए डेटाबेस से पूछता हूं। – Dexter

+0

चूंकि आप FormsCookieName का उपयोग करके कुकी सेट कर रहे हैं, और आपके पास फॉर्म प्रमाणीकरण सक्षम है, फॉर्म प्रमाणीकरण कुकी को डिक्रिप्ट कर रहा है और एप्लिकेशन_एट प्रमाणीकरण रिवेस्ट को कॉल करने से पहले आपके लिए HttpContext.Current.User सेट कर रहा है। फॉर्म प्रमाणीकरण टिकट का उपयोग पूरी तरह से स्वीकार्य है। –

+0

अंतिम भाग के लिए, भूमिकाओं का उपयोग करके - याद रखें कि HttpContext.Current.User आपके अनुरोध हैंडलिंग में कहीं भी उपलब्ध है। प्रत्येक "भूमिका" क्वेरी के लिए डेटाबेस को मारने से बचने के लिए, आप उपयोगकर्ता के लिए सभी भूमिकाओं को एप्लिकेशन_एट प्रमाणीकरण रिवेस्ट में एक डेटाबेस कॉल के साथ सेट कर सकते हैं। इसे "प्रति अनुरोध भूमिका कैश" पर विचार करें। –

2

अपने प्राधिकरण टैग में एक समस्या नहीं है, होना चाहिए:

<authorization> 
    <deny users="?" /> 
    <allow users="*" /> 
</authorization> 

क्योंकि आप अज्ञात उपयोगकर्ताओं से इनकार करना चाहते हैं। यदि आप इसे ठीक करते हैं, तो आप मास्टर पेज और global.asax से सभी सामानों को सुरक्षित रूप से हटा सकते हैं - आपको सत्र में संग्रहीत अपनी स्वयं की कस्टम पहचान में फ़ॉर्म पहचान को रीमेप करने की आवश्यकता नहीं है। यह संसाधनों का अपशिष्ट है और मुझे नहीं लगता कि यह आपके समाधान की सुरक्षा को एक महत्वपूर्ण तरीके से उठाता है। आप फॉर्म कुकी पर भरोसा कर सकते हैं।

+0

आह मैं देखता हूँ। लेकिन मैं अज्ञात उपयोगकर्ताओं को लॉगिन का चयन करने के लिए मुख्य पृष्ठ की तरह देखना चाहता हूं। और मैं चाहता हूं कि वे कुछ अन्य पेज देखें। मुझे मास्टरपेज सामान का उपयोग करने की भी आवश्यकता है क्योंकि मुझे प्रत्येक पृष्ठ पर उपयोगकर्ता आईडी की आवश्यकता है, मुझे मास्टरपेज पर प्रमाणीकरण की जांच करनी है या फिर एएसपीनेट कैसे पता चलेगा कि कौन से पेज अज्ञात उपयोगकर्ताओं को अनुमति नहीं देते हैं? मुझे यह सुनिश्चित करना है कि उपयोगकर्ता कई पृष्ठों पर लॉग इन है। (यदि संदर्भ। पहचान। यह प्रमाणीकृत एक बड़ा हिस्सा है अगर/अन्य पेड़, तो अन्य मामले भी हैं)। – Dexter

+0

इसके अलावा मेरा रीडायरेक्ट अभी काम नहीं कर रहा है ... – Dexter

+0

इसका मतलब क्या है "काम नहीं कर रहा है"? –

6

मैं इस विषय पर थोड़ी देर हो चुकी हूँ, लेकिन रूपों प्रमाणीकरण लागू करने के लिए, जबकि चीजों को सरल रखने (जैसे मैं करने के लिए कोशिश कर रहा था) की कोशिश कर रहा है उन, यहाँ प्रासंगिक सबसे वर्तमान प्रलेखन मैं MSDN पर पाया है के लिए: http://msdn.microsoft.com/en-us/library/xdt4thhy(v=vs.100).aspx

संक्षेप में, कुकीज़ सेट करने, उन्हें जांचने, टिकट या प्रिंसिपल को तुरंत चालू करने के साथ गड़बड़ न करें ... इसे FormsAuthentication कक्षा में छोड़ दें।

लॉग पर, अपने कोड साख की जाँच करें और यदि वे मान्य हैं, बस

FormsAuthentication.RedirectFromLoginPage(yourUserId, false); 

फोन यह आप के लिए प्रमाणीकरण कुकी, जो, रीडायरेक्ट के साथ संयुक्त सेट करता है जब पर, पर्याप्त है। प्राधिकरण को जारी रखने के लिए "false" है: यह ब्राउज़र बंद (या प्राधिकरण टाइमआउट) पर खो जाएगा।

पहले से ही प्रमाणित अनुरोध पर, आपके प्रमाणीकरण को मान्य करने के लिए कोड द्वारा जांचने के लिए कुछ भी नहीं है। कौन कनेक्ट है यह जानने के लिए Context.User.Identity.Name का उपयोग करें (ऊपर स्ट्रिंग yourUserId होगा)।

स्पष्ट लॉगआउट पर, फोन

FormsAuthentication.SignOut(); 
FormsAuthentication.RedirectToLoginPage(); 

और रूपों प्रमाणीकरण web.config में कॉन्फ़िगर किया है।

<system.web> 
    <authentication mode="Forms"> 
    <forms loginUrl="yourLoginPage" defaultUrl="yourDefaultPageAfterLogin"> 
    </forms> 
    </authentication> 
    <authorization> 
    <deny users="?" /> 
    </authorization> 
</system.web> 

ध्यान दें कि MVC अनुप्रयोगों के लिए प्राधिकरण हिस्सा विन्यास से हटाया जाना चाहिए और AuthorizeAttribute एक वैश्विक फिल्टर विशेषता के रूप में पंजीकृत के साथ संभाला, नियंत्रकों या यह जरूरत के कार्यों पर AllowAnonymousAttribute के उपयोग के साथ। (एमवीसी 4; इससे पहले, इसे संभालने के लिए इसे अपने गुण बनाना आवश्यक था।)

1

मुझे याद रखने के लिए पूर्ण वर्कफ़्लो की आवश्यकता है: 1. कुकी पर कस्टम डेटा लिखें। 2. उस कस्टम डेटा को पढ़ें।

यहां तक ​​कि अगर आप कुकी के माध्यम से एक अनुरोध प्रमाणित कर सकते हैं, इसका मतलब यह नहीं एक HttpSession उद्देश्य यह है कि अनुरोध के लिए पुन: प्रारंभ योग्य है।

http://www.codeproject.com/Articles/779844/Remember-Me

enter image description here

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