2013-07-14 7 views
19

मुझे सफल लॉगिन के बाद सीधे उपयोगकर्ता आईडी ग्रिड प्राप्त करने की आवश्यकता है। निम्नलिखित कोड काम नहीं करता:उपयोगकर्ता। Identity.Is प्रमाणीकृत सफल लॉगिन के बाद गलत है

if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value)) 
{ 
    FormsAuthentication.SignOut(); 
    FormsAuthentication.SetAuthCookie(txtUsername.Value, true); 

    MembershipUser user = Membership.GetUser(txtUsername.Value); 

    if (user != null) 
    { 
     Guid puk = (Guid)user.ProviderUserKey; 
    } 
} 

इस क्यों होता है:

if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value)) 
{ 
    FormsAuthentication.SignOut(); 
    FormsAuthentication.SetAuthCookie(txtUsername.Value, true); 

    if (HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     // doesn't run 
     Guid puk = (Guid)Membership.GetUser().ProviderUserKey;    
    } 
} 

निम्नलिखित कोड काम करता है? SetAuthCookie के अलावा क्या करने के लिए कुछ और है?

उत्तर

13

क्योंकि जब आप FormsAuthentication.SetAuthCookie(txtUsername.Value, true); पर कॉल करते हैं तो आप ग्राहक की कुकीज़ पर कुंजी संग्रहीत करते हैं। इसके लिए आपको उपयोगकर्ता को प्रतिक्रिया देना होगा। और कुकी के साथ भरने के लिए HttpContext.Current.User.Identity के लिए आपको एक और अनुरोध की आवश्यकता है।

कम अपने योजना में इस तरह दिखता है:

  1. ग्राहक अपने उपयोगकर्ता नाम और पासवर्ड को भेजता है।

  2. सर्वर इसे प्राप्त करता है और जांचता है। यदि वे मान्य हैं तो सर्वर क्लाइंट को Set-Cookie शीर्षलेख भेजता है।

  3. ग्राहक इसे प्राप्त करता है और संग्रहीत करता है। प्रत्येक अनुरोध के लिए ग्राहक सर्वर पर कुकीज़ भेजता है। के लिए @Jake

अद्यतन में HttpContext

var identity = new System.Security.Principal.GenericIdentity(user.UserName); 
var principal = new GenericPrincipal(identity, new string[0]); 
HttpContext.Current.User = principal; 
Thread.CurrentPrincipal = principal; 

नोट User स्थापित करने का एक उदाहरण जोड़ा जा रहा है कि आप अपने कस्टम प्रिंसिपल वर्ग इनहेरिट GenericPrincipal

+0

वहाँ एक ही अनुरोध में उपयोगकर्ता पहचान का उपयोग करने की कोई तरीका है? –

+1

@ अहमद अहमदी आप इसे मैन्युअल रूप से कस्टम प्रिंसिपल ऑब्जेक्ट को HttpContext की उपयोगकर्ता प्रॉपर्टी को असाइन कर सकते हैं। –

+0

@OleksiiAza क्या आप यह संभवतः यह दिखाने के लिए अपना उत्तर अपडेट कर सकते हैं कि यह कैसे करें? – Jake

22

से या ClaimsPrincipal मैं था बना सकते हैं एक ही समस्या भी। मैं web.config कॉन्फ़िगरेशन सेट करना भूल गया।

शायद आप भी चूक गए।

<system.web> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/user/login" timeout="1000" name="__Auth" /> 
    </authentication> 
    </system.web> 
0

मैं सब से ऊपर समाधान करने की कोशिश की, लेकिन बात यह है कि मेरी समस्या का हल web.config

<modules> 
    <remove name="FormsAuthentication"/> 
</modules> 
0

मेरे विकास पर्यावरण मामले में इस टिपण्णी कर रहा था, requireSSL संपत्ति सही पर सेट किया है, मैं गया था इसे requireSSL = false पर बदलकर समस्या को ठीक किया गया।

enter image description here

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