2012-11-30 37 views
6

है, मैं अपने .NET MVC4 प्रोजेक्ट में SimpleMembership का उपयोग कर रहा हूं। विकास के दौरान, डेटाबेस को मैन्युअल रूप से मैनिपुलेट/पुनर्निर्माण करते समय, मुझे एक त्रुटि मिली है जो उत्पादन में असंभव नहीं होगी, लेकिन मैं इसे हल करना चाहता हूं और मुझे इसे संभालने का एक शानदार तरीका नहीं मिल रहा है।.NET MVC4 SimpleMembership त्रुटि - "कोई उपयोगकर्ता नहीं मिला था जिसका नाम xxx"

यदि, एप्लिकेशन में लॉग इन करने के बाद, आपका उपयोगकर्ता नाम डेटाबेस में बदल जाता है, या आपका उपयोगकर्ता रिकॉर्ड पूरी तरह से हटा दिया जाता है, तो उपयोगकर्ता अब एप्लिकेशन के किसी भी पेज तक पहुंच नहीं पाएगा ... सार्वजनिक पृष्ठों सहित अनाम दृश्य, और लॉगिन स्क्रीन। इसके बजाए, एक अपवाद फेंक दिया गया है - "कोई उपयोगकर्ता नहीं मिला था जिसका नाम 'उपयोगकर्ता नाम' है।

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

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

क्या किसी को भी इस परिदृश्य का बेहतर समाधान मिला है? मैंने पुराने .NET सदस्यता प्रदाता का उपयोग करके इस तरह के मुद्दों का कभी सामना नहीं किया है ... मेरी उम्मीद यह है कि इस स्थिति को बॉक्स के ठीक बाहर कवर किया जाना चाहिए और मुझे इसके लिए खाता नहीं रखना चाहिए ... यदि कोई रिकॉर्ड बदल दिया गया है/डीबी में हटा दिया गया है, उपयोगकर्ता को प्राधिकरण को विफल करना चाहिए और स्वचालित रूप से लॉगिन पृष्ठ पर रीडायरेक्ट किया जाना चाहिए।

उत्तर

1

क्या आप लॉग इन करने के बाद डीबी कैश या कहीं पृष्ठ देख सकते हैं, उपयोगकर्ता रिकॉर्ड की निर्भरता, जहां यह निर्भर है, चेन डिलीट हो सकता है या यह निर्भरता इंजेक्शन के कारण हो सकता है।

इसके लिए जांच करें या कोड साझा करें ..

-1

यह जब स्विचन यदि आप किसी अन्य की मेजबानी के लिए पर्यावरण देव से कारण हो रहा है। लोकलहोस्ट लॉगिन कुकी को याद कर रहा है और इसे नए सरल सदस्यता डेटाबेस के विरुद्ध उपयोग करने का प्रयास कर रहा है।

जैसा कि आपने कहा था कि यह उत्पादन में नहीं होता है। क्षमा करें मुझे स्थानीय और उत्पादन दोनों डेटाबेस पर एक ही लॉगिन का उपयोग करने से बेहतर तरीका नहीं पता है। वहाँ है,

protected void Application_Error(object sender, EventArgs e) 
    { 
     Exception ex = Server.GetLastError(); 

     if (ex.Message.Contains("No user found was found that has the name")) 
     { 
      FormsAuthentication.SignOut(); 
      Response.Redirect(Request.RawUrl); 
     } 
    } 

के बाद से फेंका अपवाद सिर्फ एक System.InvalidOperationException है:

Global.asax.cs में:

+0

खैर मैं यह अभी भी कल्पना उत्पादन में होगा, मेरा मतलब यह था कि ऐसा नहीं होगा क्योंकि उत्पादन की स्थिति में मैं डेटाबेस में रिकॉर्ड मैन्युअल रूप से हटा नहीं पाऊंगा। यह मेजबान स्विच करने की बात नहीं है। मैंने इसे दूर करने का तरीका जानने का अधिक समय नहीं बिताया है, लेकिन इसे मूल रूप से मेरे ब्राउज़र में एक प्रमाणीकरण कुकी के साथ करना है जो किसी ऐसे उपयोगकर्ता का संदर्भ देता है जो डेटाबेस में मौजूद नहीं है ... मैं बस यह चाहता हूं कि इसे संभाला जा सके बॉक्स से अधिक सुंदरता से बाहर। – Gadget27

1

जहाँ आप अपने प्रमाणीकरण तर्क पहले है, लेकिन यहाँ सुनिश्चित नहीं हैं कि मैं क्या कर रहा है आप इसके साथ इतना कुछ नहीं कर सकते हैं। बहुत स्मार्ट नहीं है, लेकिन क्या करने की जरूरत है। वहाँ IsUserInRole(...) की तरह कोई प्रमाणीकरण तर्क है इसके अलावा, यह सुनिश्चित करें कि पृष्ठ पर आप पुनः निर्देशित कर रहे हैं, अगर हाँ है तो आप उस में try{} catch(){}

1

मैं इस समस्या का एक ही तरह हो रही थी, IsAuthenticated लौटने true जब मैं था लपेट सकता है चाहता हूँ एमवीसी 4 साइट में लॉग इन नहीं किया गया है, जिसके परिणामस्वरूप एक ही त्रुटि संदेश है। हमारे समाधान में मेरे पास सरल Membership के साथ दो एमवीसी 4 साइटें थीं और यह पता चला कि दूसरी साइट को डीबग करते समय मैं पहली साइट पर लॉग इन था। मुझे लगता है कि इसे कुकी के साथ करना होगा जो सेट हो जाता है क्योंकि दोनों साइट localhost एन पर उदासीन बंदरगाह के तहत चलती हैं, इसलिए दोनों एक ही प्रमाणीकरण कुकी सेट करेंगे।मुझे शायद यह बदलने की आवश्यकता होगी कि प्रमाणीकरण कुकी कैसे सेट की जाएगी।

मुझे लगता है कि आपको एक अलग समस्या हो सकती है, लेकिन हो सकता है कि मेरा "समाधान" इस समस्या वाले किसी को भी मदद कर सके।

+1

यह समाधान मेरे लिए काम करता था, मैं किसी अन्य साइट से लॉग इन था और जब मैंने साइट्स को स्विच किया तो यह मुझे यह त्रुटि दे रहा था। बस अपने कैश/कुकीज़ साफ़ करें, यह ठीक काम करेगा। –

0

अवहेलना AuthorizeAttribute:

public sealed class AuthorizeAttribute : System.Web.Http.AuthorizeAttribute 
{ 
    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
    try 
    { 
     return base.IsAuthorized(actionContext); 
    } 
    catch 
    { 
     return false; // user name from cookie is no longer in db 
    } 
    } 

    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
    // handle this exception by global exception filter for redirection to login 
    throw new CustomAuthException(); 
    } 
} 
0

मैं अरमान Bimatov प्रतिक्रिया में शामिल किया है इतना है कि यह वर्तमान पृष्ठ से पुनः निर्देशित इससे पहले कि आप बाहर है लॉग इन करें। और आपको वर्तमान पृष्ठ पर रीडायरेक्ट करके, queryURL को क्वेरी स्ट्रिंग में सही ढंग से रखा जाएगा।

Global.asax.cs में:

 
protected void Application_Error(object sender, EventArgs e) 
    { 
     Exception ex = Server.GetLastError(); 

     if (ex.Message.Contains("No user found was found that has the name")) 
     { 
     FormsAuthentication.SignOut(); 
     Response.Redirect(Request.RawUrl); 
     } 
    } 

बहरहाल, यह जब तक आप इस सवाल के अनुसार अपने web.config में एक CustomerErrors अनुभाग है काम नहीं करेगा: global.asax Application_Error not firing

+0

http://stackoverflow.com/questions/3713939/global-asax-plication-error-not-firing –

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