2011-08-17 20 views
13

मैं एएसपी.नेट एमवीसी का उपयोग कर रहा हूं। जब सत्र समाप्त हो जाता है तो मैं लॉगिन पेज पर रीडायरेक्ट करना चाहता हूं। इसे कैसे प्राप्त किया जा सकता है? अगर मैं नियंत्रक में किसी विधि को AJAX कॉल कर रहा हूं तो यदि मेरा सत्र उस स्थिति में समाप्त हो जाता है तो भी मैं लॉगिन पेज पर रीडायरेक्ट करना चाहता हूं।एएसपी.नेट एमवीसी के साथ सत्र पृष्ठ पर रीडायरेक्ट होने पर

उत्तर

15

आप 3 तरीके से ऐसा कर सकता है:

  1. अपने कार्यों एक फ़िल्टर बनाकर और यह (पहले कार्रवाई के बाद मार दिया) OnActionExecuting में एक कोड प्रोग्रामिंग लागू होते हैं, http://www.asp.net/mvc/tutorials/understanding-action-filters-cs

  2. एक आधार बनाएं कक्षा (नियंत्रक वर्ग से विरासत) और अपने नियंत्रकों को इस से विरासत में बनाते हैं। इस कक्षा में आप फ़िल्टर की तरह OnActionExecuting नामक एक विधि को ओवरराइट कर सकते हैं।

  3. प्रमाणीकरण के लिए सत्र का उपयोग न करें, आप प्रपत्र प्रमाणीकरण का उपयोग और यह आसान उपयोग करने के लिए रख सकते हैं, यह देखने के लिए: http://weblogs.asp.net/fredriknormen/archive/2008/02/07/asp-net-mvc-framework-using-forms-authentication.aspx

मेरी राय में, समाधान 3 अन्य की तुलना में बेहतर है। आशा है कि ये आपके काम आएगा!

+6

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

+0

समाधान 1 तकनीकी रूप से गलत है। हालांकि एक फ़िल्टर, एक प्राधिकरण 'AuthorizeAttribute' और 'IAuthorizationFilter' से लिया गया है और फिर स्थिति के आधार पर' ऑनअधिकृतकरण 'और/या' AuthorizeCore' को ओवरराइड करता है। यह मामला एमवीसी 2 पर वापस आता है। –

+0

@ एरिकफिलिप्स, क्या आप आगे स्पष्टीकरण के लिए एक लिंक/उदाहरण सुझा सकते हैं। धन्यवाद। एक समस्या के लिए –

7

क्योंकि फॉर्म-प्रमाणीकरण की सुरक्षा-कुकी की प्रतिलिपि बनाना संभव है, एक पंजीकृत उपयोगकर्ता को अनुकरण करने के लिए मैं वर्तमान सत्र जीवनकाल में प्रमाणीकरण को बांधने के लिए निम्न विशेषता का उपयोग करता हूं।

विशेषता कार्य करने के लिए आपको लॉगआउट पर सत्र ["उपयोगकर्ता"] = MyUser लॉगिन और कॉल session.abandom() सेट करना होगा। मुझे नहीं पता कि रीडायरेक्ट AJAX कॉल के साथ काम करता है - यह ऐसा कुछ है जिसे आप आजमा सकते हैं।

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class CheckUserSessionAttribute : ActionFilterAttribute 
{ 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpSessionStateBase session = filterContext.HttpContext.Session; 
     var user = session["User"]; 

     if (((user == null) && (!session.IsNewSession)) || (session.IsNewSession)) 
     { 
      //send them off to the login page 
      var url = new UrlHelper(filterContext.RequestContext); 
      var loginUrl = url.Content("~/Account/LogOff"); 
      session.RemoveAll(); 
      session.Clear(); 
      session.Abandon(); 
      filterContext.HttpContext.Response.Redirect(loginUrl, true); 
     } 
    } 
} 
+0

रीडायरेक्ट मेरे लिए काम नहीं कर रहा है। मेरे पास एक एमवीसी मोबाइल साइट है जिसका अर्थ है कि सबकुछ AJAX का उपयोग करता है। सुनिश्चित नहीं है कि आप काम पर रीडायरेक्ट कैसे प्राप्त करते हैं। –

+0

यदि मैं इस विशेषता को किसी वर्ग में लागू करता हूं, तो मैं इसे क्रिया में लागू करने के लिए एक उलटा विशेषता कैसे लिख सकता हूं? उदाहरण के लिए UncheckUserSessionAttribute – Wachburn

+0

मुझे लगता है कि यह एमवीसी ढांचे द्वारा समर्थित नहीं है। जहां तक ​​मुझे पता है कि यह सभी फ़िल्टर विशेषताओं का मूल्यांकन करेगा। मैं आपकी समस्या को हल करने के तरीके की कल्पना नहीं कर सकता। तो आपको इसे अपनी कक्षा में हर विधि पर लागू करना होगा। – Michael

3

यह उत्तर देता भारी माइकल्स पर आधारित है सिवाय यह ;-)

मैं इसे बदल एक लेने के लिए काम करता है यह जांचने के लिए प्रतिनिधि है कि सत्र समाप्त हो गया है, इसलिए यह अलग-अलग ऐप्स में काम कर सकता है, जिसमें इसे निर्धारित करने के विभिन्न तरीके हो सकते हैं और लॉगिन पृष्ठ अन्य ऐप्स में भी भिन्न हो सकता है। Global.asax.cs Application_Start() में कोड मेरे एप्लिकेशन में मेरे पास है

CheckUserSessionAttribute.CheckSessionAlive = session => (session.GetUser() != null); 
CheckUserSessionAttribute.LoginUrl = "~/Account/Login"; 

तो विशेषता वर्ग के रूप में अपने नियंत्रक से

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
    public class CheckUserSessionAttribute : ActionFilterAttribute 
    { 
     public static String LoginUrl { get; set; } 
     public delegate bool CheckSessionDelegate(HttpSessionStateBase session); 

     public static CheckSessionDelegate CheckSessionAlive; 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 

      HttpSessionStateBase session = filterContext.HttpContext.Session; 
      if ((CheckSessionAlive == null) || (CheckSessionAlive(session))) 
        return; 


      //send them off to the login page 
      var url = new UrlHelper(filterContext.RequestContext); 
      var loginUrl = url.Content(LoginUrl); 
      session.RemoveAll(); 
      session.Clear(); 
      session.Abandon(); 

      filterContext.HttpContext.Response.StatusCode = 403; 
      filterContext.HttpContext.Response.Redirect(loginUrl, false); 
      filterContext.Result = new EmptyResult(); 

     } 
    } 

इस प्रकार बस [CheckUserSession] उपरोक्त गुण जोड़ने है कक्षा या व्यक्तिगत कार्यवाही।

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

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