2011-06-04 17 views
6

मैं जिसके लिए मैं प्राधिकरण को लागू कर रहा हूँ मेरे अपने लॉगिन दृश्य है जो उपयोगकर्ताओं को नाम और पासवर्ड अनुमति दी जाती है अगर जाँच करता है और उसके बाद सत्र कि कहने के लिए में एक चर सेट का उपयोग कर एक MVC 3 एप्लिकेशन है उपयोगकर्ता को लॉग इन किया जाता है। इस तरह के काम लेकिन एक विशेष विचार के लिए यह एक अजीब अवांछित तरीके से व्यवहार कर रहा है। कहा गया दृश्य एक ऐसा फॉर्म है जिसका उपयोग मैं कुछ डेटा इनपुट करने और फ़ाइल अपलोड करने के लिए करता हूं। किसी कारण से मैं समझ नहीं पा रहा हूं, इस फ़ॉर्म को पोस्ट करने के बाद एक नया सत्र शुरू हो गया है और इसलिए वेरिएबल जो याद करता है कि उपयोगकर्ता लॉग इन था, उसे गलत पर रीसेट कर दिया गया है और बाद में लॉगिन पेज फिर से प्रदर्शित होता है।ASP.Net MVC 3 अजीब सत्र व्यवहार

मैं क्यों आवेदन इस बिंदु पर एक नया सत्र शुरू हो रहा है के रूप में खो दिया है कर रहा हूँ? मैंने इसे करने के लिए निर्देश नहीं दिया है। क्या कोई इस व्यवहार को रोकने और पुराने सत्र को रखने के लिए समाधान सुझा सकता है?

धन्यवाद।

अद्यतन - कुछ कोड:

नोट सत्र तैनात Create प्रपत्र के जवाब के बाद तुरंत समाप्त किया जा रहा है

सीएमएस नियंत्रक जो एक कस्टम Autorize विशेषता "RDAutorize" पर बुलाया का उपयोग करता है सभी कार्यों:

[RDAuthorize] 
public class PhotoCMSController : Controller 
{ 

public ActionResult Create() 
{ 
    /* Code omitted: set up a newPhoto object with default state */ 
    /* Display view containing form to upload photo and set title etc. */ 
    return View("../Views/PhotoCMS/Create", newPhoto); 
} 

[HttpPost] 
public ContentResult Upload(int pPhotoId) 
{ 
    /* Code ommited: receive and store image file which was posted 
    via an iframe on the Create view */ 
    string thumbnail = "<img src='/path/to/thumb.jpg' />"; 
    return Content(thumbnail); 
} 

[HttpPost] 
public ActionResult Create(string pPhotoTitle, string pCaption etc...) 
{ 
    /*Code omitted: receive the rest of the photo data and save 
     it along with a reference to the image file which was uploaded 
     previously via the Upload action above.*/ 

     /* Display view showing list of all photo records created */ 
     return View("../Views/PhotoCMS/Index", qAllPhotos.ToList<Photo>()); 

     /* **Note: after this view is returned the Session_End() method fires in 
     the Global.asax.cs file i.e. this seems to be where the session is 
     being lost** */ 
} 

}/*End of CMS Controller*/ 

कस्टम अधिकृत कार्रवाई फिल्टर:

public class RDAuthorize : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Boolean authorized = Convert.ToBoolean(
      HttpContext.Current.Session["UserIsAuthorized"] 
     ); 

     if (!authorized) { 
      /* Not logged in so send user to the login page */ 
      filterContext.HttpContext.Response.Redirect("/Login/Login"); 
     } 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) {} 
    public override void OnResultExecuting(ResultExecutingContext filterContext) {} 
    public override void OnResultExecuted(ResultExecutedContext filterContext) {} 

}/*End of Authorize Action Filter*/ 

लॉग इन नियंत्रक:

public class LoginController : Controller 
{ 
    private PhotoDBContext _db = new PhotoDBContext(); 

    public ActionResult Login() 
    { 
     string viewName = ""; 
     Boolean authorized = Convert.ToBoolean(Session["UserIsAuthorized"]); 
     if (authorized) 
     { 
      viewName = "../Views/Index"; 
     } 
     else 
     { 
      viewName = "../Views/Login/Login"; 
     } 
     return View(viewName); 
    } 

    [HttpPost] 
    public ActionResult Login(string pUsername, string pPassword) 
    { 
     string viewName = ""; 
     List<Photo> model = new List<Photo>(); 

     var qUsers = from u in _db.Users 
       select u; 

     foreach (User user in qUsers.ToList<User>()) 
     { 
      /* If authorized goto CMS pages */ 
      if (pUsername == user.Username && pPassword == user.Password) 
      { 
       Session["UserIsAuthorized"] = true; 
       var qPhotos = from p in _db.Photos 
           where p.IsNew == false 
           select p; 

       model = qPhotos.ToList<Photo>(); 
       viewName = "../Views/PhotoCMS/Index"; 
       break; 
      } 
     } 

     return View(viewName, model); 

    } 

}/* End of Login controller */ 
+0

पहले कोड जोड़ने के लिए क्षमा नहीं। मुझे उम्मीद है कि उपर्युक्त उपयोगी है। –

+0

इस पोस्ट के लिए धन्यवाद, मैंने सीखा कि प्राधिकरण का उपयोग कैसे करें। – sed

उत्तर

2

बाहर कर देता है पूरे ASP.Net आवेदन को पुन: प्रारंभ हो गया क्योंकि फोटो अपलोड के हिस्से के रूप में मैं एक अस्थायी च में छवि फ़ाइल भंडारण किया गया था पुरानी और फिर फ़ाइल को स्थायी स्थान पर ले जाने के बाद निर्देशिका को हटा देना। स्पष्ट रूप से एएसपी.Net के लिए इसके डिफ़ॉल्ट व्यवहार को पुनरारंभ करने के लिए यदि वेबसाइट के भीतर एक निर्देशिका हटा दी गई है।मुझे यह post मिला जो समस्या का वर्णन करता है और एक समाधान प्रदान करता है जिससे निम्न कोड Global.asax.cs फ़ाइल में जोड़ा जाता है। इस समाधान को लागू करने से समस्या ठीक हो गई है। ठीक Application_Start() घटना से FixAppDomainRestartWhenTouchingFiles बुला() द्वारा लागू किया जाता है:

protected void Application_Start() 
    { 
     FixAppDomainRestartWhenTouchingFiles(); 
    } 

    private void FixAppDomainRestartWhenTouchingFiles() 
    { 
     if (GetCurrentTrustLevel() == AspNetHostingPermissionLevel.Unrestricted) 
     { 
      /* 
      From: http://www.aaronblake.co.uk/blog/2009/09/28/bug-fix-application-restarts-on-directory-delete-in-asp-net/ 
      FIX disable AppDomain restart when deleting subdirectory 
      This code will turn off monitoring from the root website directory. 
      Monitoring of Bin, App_Themes and other folders will still be 
      operational, so updated DLLs will still auto deploy. 
      */ 

      PropertyInfo p = typeof(HttpRuntime).GetProperty(
       "FileChangesMonitor", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static); 
      object o = p.GetValue(null, null); 
      FieldInfo f = o.GetType().GetField(
       "_dirMonSubdirs", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase); 
      object monitor = f.GetValue(o); 
      MethodInfo m = monitor.GetType().GetMethod(
       "StopMonitoring", BindingFlags.Instance | BindingFlags.NonPublic); 
      m.Invoke(monitor, new object[] { }); 
     } 
    } 

    private AspNetHostingPermissionLevel GetCurrentTrustLevel() 
    { 
     foreach (AspNetHostingPermissionLevel trustLevel in 
      new AspNetHostingPermissionLevel[] { 
       AspNetHostingPermissionLevel.Unrestricted, 
       AspNetHostingPermissionLevel.High, 
       AspNetHostingPermissionLevel.Medium, 
       AspNetHostingPermissionLevel.Low, 
       AspNetHostingPermissionLevel.Minimal } 
      ) 
     { 
      try 
      { 
       new AspNetHostingPermission(trustLevel).Demand(); 
      } 
      catch (System.Security.SecurityException) 
      { 
       continue; 
      } 

      return trustLevel; 
     } 

     return AspNetHostingPermissionLevel.None; 
    } 
+2

खराब समाधान desing (जैसे कुछ निर्देशिकाओं को हटाने) हमें एएसपीनेट आधारभूत संरचना को बेहतर और बेहतर तरीके से जानने दें :) एएसपीनेट फाइल सिस्टम मॉनिटर के काम करने के गहरे विवरण के लिए धन्यवाद (यह बदले गए विचारों को पुन: संकलित करने के लिए ज़िम्मेदार है, कोड के बाद पुनरारंभ होता है फाइल/डीएलएल/web.config या फ़ोल्डर संरचना बदल दी गई है, और asp.net कैशिंग के लिए फ़ाइल निर्भरता कुछ और हो सकती है)। यह दयालु है कि उत्तरदाताओं में से कोई भी इस समस्या को हल करने का मौका नहीं देता है। लेकिन कृपया, इस हैक का उपयोग न करें, इस temp निर्देशिका को प्रोजेक्ट में जोड़ें और इसे हटाएं। –

0

के बाद से सत्र कुकी के साथ संबद्ध, वे एक विशिष्ट डोमेन के लिए उपलब्ध हैं।

यह (अर्थात् एक उप डोमेन के लिए पुनः निर्देशित), जबकि डोमेन बदल गया है एक ही आवेदन पत्र में एक सत्र चर के लिए पूछने के लिए एक आम गलती है।

+0

यह एक दिलचस्प बिंदु Xaqron है। हालांकि, जिन विचारों का मैं उपयोग कर रहा हूं, वे इस यूआरएल पैटर्न का पालन करते हैं: लोकलहोस्ट: पोर्ट/कंट्रोलर/व्यूनाम इसलिए मुझे लगता है कि इसका मतलब है कि वे सभी एक ही डोमेन में हैं। –

+0

चूंकि सत्र गुम हो गया है, इसलिए दो कारण इसका कारण बन सकते हैं। 1) यह वहां नहीं है ('w3p' समाप्त हो गया है, जो आम नहीं है) 2) यह वहां है लेकिन आप इसे एक्सेस नहीं कर सकते (जो आम है)। उम्मीद है की यह मदद करेगा। – Xaqron

0

नियंत्रक कार्रवाई है कि आप प्रपत्र पोस्ट कर रहे हैं किसी भी [अधिकृत] विशेषता शामिल करता है। आपको कुछ कोड पोस्ट करने की आवश्यकता है।

+0

हां मैं एक कस्टम [अधिकृत] विशेषता का उपयोग कर रहा हूँ। मैंने इसके लिए कुछ कोड शामिल करने के लिए अपना प्रश्न संपादित किया है। यदि आप इसे देख सकते हैं तो बहुत आभारी होंगे। –

+0

मैं कोड में किसी भी समस्या का पता लगाने में सक्षम नहीं था। क्या आप कुछ का उपयोग कर रहे हैं Response.End()? क्या आप किसी भी HTTP पोस्ट के बाद सत्र खो रहे हैं? – VJAI

+0

सत्र_एंड() को 'पोस्ट' एक्शन परिणाम विधि में HTTP पोस्ट के दौरान या तुरंत निकाल दिया गया है। –

0
  1. सत्यापित करें कि हर बार एक नया सत्र वास्तव में शुरू होता है। उपयोगकर्ता की सत्र आईडी के लिए ट्रेस आउटपुट की जांच करें ताकि यह सुनिश्चित हो सके कि यह फिर से बदल गया है।
  2. सुनिश्चित कुकी पर भेजा वास्तव में स्थापना की और पर भेजा जा रहा है हो रही है। (जिसे ASPsessionIDSOMETHING कहा जाता है) और यदि ब्राउज़र द्वारा भेजा जा रहा है। उपकरण फ़िडलर आसानी कुकीज़ जाँच करने के लिए (सेट कुकी शीर्ष लेख सर्वर और अनुरोध वापस ब्राउज़र से सर्वर के लिए जा रहा कुकीज़ से आ रही करें। सुनिश्चित करें कि आपकी ब्राउज़र कुकी स्वीकार कर रहा है और आप कहते हैं न ... कुकी बंद कर दिया है।
  3. अपने सत्र id पहली बार फिर अपने सत्र ठीक से सेट नहीं हो रही है हर अनुरोध पर बदल रहा है, तो उस कोड यदि आप पहले से ही havent पर एक को तोड़ने बिंदु निर्धारित
  4. आपको लॉग जब वर्कर प्रोसेस फिर सेट करता है सकते हैं -। सुनिश्चित कि ऐसा नहीं है। देखना http://www.microsoft.com/technet/prodtechnol/windowsserver2003/library/IIS/87892589-4eda-4003-b4ac-3879eac4bf48.mspx
+0

सत्र आईडी बदल नहीं रही है, लेकिन मुझे पता है कि सत्र समाप्त हो रहा है और एक नया प्रारंभ किया जा रहा है क्योंकि मेरे पास Global_asax.cs फ़ाइल में सत्र_स्टार्ट() और सत्र_एंड() विधियों में ब्रेकपॉइंट हैं। अगर आप उस कोड को देख सकते हैं जो मैंने अभी जोड़ा है तो मैं बहुत आभारी हूं। इस बीच में मैं आपके अन्य सुझावों की जांच करूंगा। –

+0

कुकीज निश्चित रूप से मेरे ब्राउज़र में चालू हो गईं। –

+0

तो यह संभावित रूप से एक ही सत्र है और आप इस मुद्दे से पीड़ित हो सकते हैं: http://stackoverflow.com/questions/3365942/asp-net-mvc-plplication-fires- सत्र-start-multiple-times-for-a- सिंगल-सत्र –

0

मैं एक ही समस्या थी। समस्या केवल तभी हुई जब सर्वर पर एक पोस्ट अनुरोध भेजा गया था और उस अनुरोध के दौरान सत्र संशोधित नहीं किया गया था। एक वर्कअराउंड के रूप में मैंने एक कस्टम फ़िल्टर लिखना था जो प्रत्येक अनुरोध पर सत्र में एक कुंजी/मूल्य लिखने से ज्यादा कुछ नहीं करता था और ग्लोबलफिल्टर संग्रह में ग्लोबलफिल्टर संग्रह में फ़िल्टर को जोड़ा गया था।

public class KeepSessionAlive : IActionFilter 
{ 
    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if(filterContext.HttpContext.Session != null) 
     { 
      filterContext.HttpContext.Session["HeartBeat"] = DateTime.Now.ToShortDateString(); 
     } 
} 

    public void OnActionExecuted(ActionExecutedContext filterContext) { } 

}

और Global.asax में:

protected override void AddCustomGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new KeepSessionAlive()); 
} 

यह सबसे अच्छा समाधान नहीं हो सकता है, लेकिन यह मुझे मेरे मामले में मदद की।

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