2010-06-07 12 views
8

मुझे एक कस्टम प्रिंसिपल के साथ एक एमवीसी अनुप्रयोग में "मुझे याद रखें" कार्यक्षमता को लागू करने में कठिनाई हो रही है। मैंने इसे ASP.NET पर उबलाया है जो मेरे लिए प्रमाणीकरण कुकी पुनर्प्राप्त नहीं कर रहा है। मैंने Google क्रोम से नीचे एक स्नैफॉट शामिल किया है।एएसपी.नेट एमवीसी प्रमाणीकरण कुकी को पुनर्प्राप्त नहीं किया जा रहा है (अद्यतन)

  1. नियंत्रक कार्रवाई के भीतर सेट किए गए Request.Cookies के परिणाम दिखाता है और पढ़ने के लिए व्यूडेटा में रखा गया है। ध्यान दें कि इसमें अनुपलब्ध है .एएसपीएक्सएयूटी कुकी

  2. क्रोम डेवलपर टूल से परिणाम दिखाता है। आप इसे देख सकते हैं .एएसपीएक्सएथ यहां शामिल है।

alt text http://i50.tinypic.com/ibctjd.png

किसी को क्या यहां मुद्दा हो सकता है पता है? ASP.NET कुकी संग्रह से इस मान को क्यों नहीं पढ़ता है?

मेरा एप्लिकेशन एक कस्टम आईप्रिनिपियर का उपयोग करता है। बिजनेस प्रिंसिपलबेस एक सीएसएलए ऑब्जेक्ट है जो आईस्टिनिपल लागू करता है। इसके लिए कोड यहां दिया गया है:

[Serializable()] 
public class MoralePrincipal : BusinessPrincipalBase 
{ 
    private User _user; 

    public User User 
    { 
     get 
     { 
      return _user; 
     } 
    } 

    private MoralePrincipal(IIdentity identity) : base(identity) 
    { 
     if (identity is User) 
     { 
      _user = (User)identity; 
     } 
    } 

    public override bool Equals(object obj) 
    { 
     MoralePrincipal principal = obj as MoralePrincipal; 
     if (principal != null) 
     { 
      if (principal.Identity is User && this.Identity is User) 
      { 
       return ((User)principal.Identity).Equals(((User)this.Identity)); 
      } 
     } 
     return base.Equals(obj); 
    } 

    public override int GetHashCode() 
    { 
     return base.GetHashCode(); 
    } 

    public static bool Login(string username, string password) 
    { 
     User identity = User.Fetch(username, password); 
     if (identity == null || !identity.IsAuthenticated) 
     { 
      identity = (User)User.UnauthenicatedIdentity; 
     } 

     MoralePrincipal principal = new MoralePrincipal(identity); 
     Csla.ApplicationContext.User = principal; 
     Context.Current.User = identity; 

     return identity != null && identity.IsAuthenticated; 
    } 

    public static void Logout() 
    { 
     IIdentity identity = User.UnauthenicatedIdentity; 
     MoralePrincipal principal = new MoralePrincipal(identity); 
     ApplicationContext.User = principal; 
     Context.Current.User = identity as User; 
    } 

    public override bool IsInRole(string role) 
    { 
     if (Context.Current.User == null || Context.Current.Project == null) 
     { 
      return false; 
     } 

     string userRole = Context.Current.User.GetRole(Context.Current.Project.Id); 
     return string.Compare(role, userRole, true) == 0; 
    } 

एप्लिकेशन कस्टम सदस्यता प्रदाता का भी उपयोग करता है। इसके लिए कोड यहाँ है।

public class MoraleMembershipProvider : MembershipProvider 
{ 
    public override bool ValidateUser(string username, string password) 
    { 
     bool result = MoralePrincipal.Login(username, password); 
     HttpContext.Current.Session["CslaPrincipal"] = ApplicationContext.User; 
     return result; 
    } 

    #region Non-Implemented Properties/Methods 

    public override string ApplicationName 
    { 
     get 
     { 
      return "Morale"; 
     } 
     set 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    // Everything else just throws a NotImplementedException 

    #endregion 
} 

मुझे नहीं लगता कि इस के किसी भी संबंधित है क्योंकि लब्बोलुआब यह है कि Request.Cookies प्रमाणीकरण कुकी वापस नहीं करता है। क्या यह कुकी के आकार से संबंधित है? मैंने सुना है कि कुकी के आकार में समस्याएं हैं।

अद्यतन: ऐसा लगता है कि यह समस्या सबडोमेन के आसपास घूमती है। इस साइट को सबडोमेन के साथ होस्ट किया जा रहा था और कुकी डोमेन खाली छोड़ दिया गया था। क्या किसी के पास कोई संकेत है कि मैं ऑथ कुकी को सभी डोमेन के साथ कैसे काम कर सकता हूं (उदा। http://mydomain.com, http://www.mydomain.com, और http://sub.mydomain.com)?

+0

क्या आप उपयोगकर्ता लॉगिन प्रक्रिया के दौरान उपयोग कर रहे कोड को पोस्ट कर सकते हैं? क्या आप केवल प्रदाता का उपयोग किए बिना बिल्टिन फॉर्म्स प्रमाणीकरण सामग्री का उपयोग कर रहे हैं? या, क्या आप अपना खुद का कस्टम प्रदाता का उपयोग कर रहे हैं? – sestocker

+0

प्रारंभिक लॉगिन के दौरान, कुकी के साथ कौन से मूल्य जुड़े होते हैं (विशेष रूप से समाप्त हो जाते हैं)? – sestocker

+0

कुकी इस तरह दिखती है: http://i50.tinypic.com/npm26c.png –

उत्तर

1

क्या आपने यह भी देखा?

ASPXAUTH cookie is not being saved

मुझे यकीन है कि अगर क्रोम में प्रदर्शित कुकी के कारण होगा, लेकिन वास्तव में नहीं ब्राउज़र के लिए पारित किया जा रहा है या अगर यह बचत लेकिन यह भी एक नज़र लायक से कुकी रोका जा सके नहीं हूँ।

+0

मैंने आकार को कम करने पर काम किया और मैं अभी भी अनुरोध के दौरान कुकी को कुकी नहीं प्राप्त कर सकता। कुकीज संग्रह जब तक सत्र में नहीं होता है। मुझे पता है कि यह सत्र कुकी नहीं है और यह डिस्क पर कायम है। –

1

यदि आप कुकी में वास्तविक उपयोगकर्ता ऑब्जेक्ट को स्टोर करने का प्रयास कर रहे हैं, तो शायद कुकी के रूप में स्टोर करना बहुत बड़ा है। मैं भी MVC प्रमाणीकरण सामान से परिचित नहीं हूँ, लेकिन वेब फ़ॉर्म में मैं आम तौर पर निम्न कार्य करें:

FormsAuthentication.RedirectFromLoginPage(user_unique_id_here, false); 

दूसरा पैरामीटर दृढता आप देख रहे हैं के लिए है।

वहां से मैं एक कस्टम संदर्भ (UserContext) बनाता हूं जिसे मैं HttpModule के माध्यम से पॉप्युलेट करता हूं जो मुझे सभी उपयोगकर्ता और भूमिका की जानकारी तक पहुंच प्रदान करता है।

चूंकि मैं एमवीसी (अभी तक) या सीएसएलए में विकसित नहीं हूं, मुझे यकीन नहीं है कि मैं कितनी मदद कर सकता हूं। अगर मैं आप थे, तो मैं कस्टम सदस्यता प्रदाता को भी हटा दूंगा। आप मोरेल प्रिंसिपल को भी कॉल कर सकते हैं। सीधे अपने प्रमाणीकरण नियंत्रक में लॉग इन करें।

+0

हां, यह मेरा विचार था जब मैं इसे लिख रहा था। मुझे लगता है कि मेरे उपयोगकर्ता ऑब्जेक्ट का क्रमबद्ध संस्करण बहुत बड़ा है। मुझे IIDentity के लिए एक अलग ऑब्जेक्ट बनाना पड़ सकता है जो छोटा है और सुरक्षित रूप से डिस्क पर क्रमबद्ध किया जा सकता है। –

+0

http://stackoverflow.com/questions/2224562/asp-net-formsauthentication-redirect-loses-the-cookie-between-redirect-and-applic –

+0

मैंने एक छोटी वस्तु का उपयोग करने पर काम किया जो धारावाहिक है और मुझे अभी भी मिलता है वही मुद्दा। मैं एक बार फिर अटक गया हूँ। –

1

याद रखें मेरी सामग्री फॉर्म 'प्रमाणीकरण सेवा (एमवीसी 2 में) या एमवीसी 1 में फॉर्म प्रमाणीकरण स्थैतिक वर्ग द्वारा निर्धारित की जानी चाहिए, यदि आप' नियमित 'खाता नियंत्रक के कोड का उपयोग कर रहे हैं। यदि आपने उस कोड को बदल दिया है, तो क्या आपको लगातार (वैकल्पिक) बूलियन परम में जोड़ना याद है, यह दर्शाता है कि लगातार कुकी का उपयोग करना है या नहीं?

यह मुझे लगता है जैसे आपको सत्र कुकी मिल रही है, लेकिन एक सतत कुकी नहीं है।

+0

कुकी ब्राउज़र की कुकीज़ में मौजूद है। मैंने फ़ायरफ़ॉक्स में फ़ायरबग और क्रोम में डेवलपर टूल्स का उपयोग करके इसे सत्यापित कर लिया है। मुद्दा यह है कि .NET संग्रह में कुकी को वापस नहीं कर रहा है। यह एक सत्र कुकी नहीं है। –

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