2012-03-26 13 views
6

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

क्या दृश्य/नियंत्रक कार्रवाई से विरोधी जालसाजी टोकन को हटाने के लिए इस दूसरे के आसपास कोई रास्ता है? हम अतिरिक्त सुरक्षा के लिए टोकन रखना पसंद करेंगे!

यह बहुत ही इस सवाल के समान है लेकिन इस mvc2 MVC ValidateAntiForgeryToken multi-tabs problem

+0

मैं आपको एक और जवाब छोड़ दिया है की उदाहरण है - मैं अपने ही सवाल का जवाब देना चाहिए था! –

उत्तर

20

एमवीसी 3 या एमवीसी 4 में यह व्यवहार डिज़ाइन किया गया है, हालांकि यह उपरोक्त समझाया गया है कि यह बहुत ही उपयोगकर्ता-असभ्य है, हालांकि उत्पादन में इस मुद्दे को सुदृढ़ तरीके से हल करने की आवश्यकता है और एप्लिकेशन को इस अजीब स्थिति को संभालने की आवश्यकता है। इस समस्या का समाधान एक ऐसा फ़िल्टर बनाना है जो लॉगिन पोस्ट पर लागू होता है जो सत्यापित करेगा कि उपयोगकर्ता लॉग इन है या नहीं और उन्हें सही पृष्ठ पर ले जाता है अन्यथा वे लॉगिन पेज पर बने रहेंगे।

नीचे फिल्टर के लिए कोड का श्रेय

/// <summary> 
/// Handle Antiforgery token exception and redirect to customer area if the user is Authenticated 
/// </summary> 
public class RedirectOnError : HandleErrorAttribute 
{ 
    /// <summary> 
    /// Override the on exception method and check if the user is authenticated and redirect the user 
    /// to the customer service index otherwise continue with the base implamentation 
    /// </summary> 
    /// <param name="filterContext">Current Exception Context of the request</param> 
    public override void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.Exception is HttpAntiForgeryException && filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      // Set response code back to normal 
      filterContext.HttpContext.Response.StatusCode = 200; 

      // Handle the exception 
      filterContext.ExceptionHandled = true; 

      UrlHelper urlH = new UrlHelper(filterContext.HttpContext.Request.RequestContext); 

      // Create a new request context 
      RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData); 

      // Create a new return url 
      string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "CustomerArea", action = "Index" })).VirtualPath; 

      // Check if there is a request url 
      if (filterContext.HttpContext.Request.Params["ReturnUrl"] != null && urlH.IsLocalUrl(filterContext.HttpContext.Request.Params["ReturnUrl"])) 
      { 
       url = filterContext.HttpContext.Request.Params["ReturnUrl"]; 
      } 

      // Redirect the user back to the customer service index page 
      filterContext.HttpContext.Response.Redirect(url, true); 
     } 
     else 
     { 
      // Continue to the base 
      base.OnException(filterContext); 
     } 
    } 
} 

है यह प्रयोग

 [HttpPost] 
     **[RedirectOnError]** 
     [ValidateAntiForgeryToken] 
     public ActionResult LogOn(LogOnViewModel model, UserSessionState session, string returnUrl) 
     { 
     ..... 
     } 
+0

मुझे समझ में नहीं आता कि क्या होता है यदि उपयोगकर्ता लॉग इन नहीं है ... क्योंकि लॉगिंग पेज पर शेष के परिणामस्वरूप अपवाद हो सकता है। – ilans

+2

जवाब में IlanS के लिए - कोड (HttpAntiForgeryException && filterContext.HttpContext.User.Identity.IsAuthenticated filterContext.Exception है) केवल रीडायरेक्ट लागू करता है, तो उपयोगकर्ता के प्रवेश करेगा, अन्यथा एक गैर प्रमाणित उपयोगकर्ता के लिए नियमित रूप से अपवाद नहीं है अगर फेंक दिया। – MORCHARD

+0

ग्रेट सॉल्यूशन! –

4

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

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

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