2012-09-18 21 views
5

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

protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     //_applicationService.CurrentUser is populated correctly at this point 
     // from Controller.User 
     if (_applicationService.CurrentUser != null) 
     { 
      if (_applicationService.CurrentUser.EmailVerified != true) 
      { 
       var url = new UrlHelper(filterContext.RequestContext); 
       var verifyEmailUrl = url.Action("EmailVerificationRequired", "Account", null); 
       filterContext.Result = new RedirectResult(verifyEmailUrl); 
      } 
     } 

    } 

नोट: मैंने इसे स्पष्ट करने के लिए अनावश्यक कोड हटा दिया है। _applicationService.CurrentUser वर्तमान उपयोगकर्ता के साथ आबादी है - और जब उस बिंदु पर उपयोगकर्ता को सही ढंग से प्रमाणीकृत किया गया है। लेकिन रीडायरेक्ट के बाद उपयोगकर्ता अब प्रमाणीकृत नहीं है।

अंतर्निहित उपयोगकर्ता प्राधिकरण को प्रभावित किए बिना मैं इस रीडायरेक्ट को कैसे प्राप्त कर सकता हूं?

मैंने अपना कोड ऑनएक्शन एक्सेलिंग में डालने का प्रयास किया है, और मैंने इसे कस्टम एक्शनफिल्टर एट्रिब्यूट में भी लागू करने का प्रयास किया है, लेकिन जहां भी मैं इसे इस रीडायरेक्ट में डालता हूं, वहां 'उपयोगकर्ता' (यानी: सिस्टम। सुरक्षा। प्रिंसिपल प्रमाणीकृत प्राप्त करने से .IPrincipal नियंत्रक। उपयोगकर्ता)।

मुझे यहां क्या याद आ रही है? उम्मीद है कि यह समझ में आता है। किसी भी मदद की बहुत सराहना की।

अपना लॉगिन कार्रवाई के लिए डैरिन के अनुरोध के जवाब में:

[HttpPost] 
    [AllowAnonymous] 
    public ActionResult Login(LoginViewModel model, string returnUrl) 
    { 
     string errorMessage = "The username or password is incorrect"; 

     if (ModelState.IsValid) 
     { 
      if (_contextExecutor.ExecuteContextForModel<LoginContextModel, bool>(new LoginContextModel(){      
       LoginViewModel = model 
      })) 
      { 
       ViewBag.CurrentUser = _applicationService.CurrentUser; 
       _formsAuthenticationService.SetAuthCookie(model.LoginEmailAddress, model.RememberMe); 

       if (_applicationService.IsLocalUrl(returnUrl)) 
       { 
        return Redirect(returnUrl); 
       } 

       return RedirectToAction("Index", "Home").Success("Thank you for logging in."); 
      } 
      else 
      { 
       errorMessage = "Email address not found or invalid password."; 
      } 
     } 

     return View(model).Error(errorMessage); 
    } 
+0

क्या आप दिखा सकते हैं कि आप उपयोगकर्ता को प्रमाणीकृत कैसे कर रहे हैं - आपकी 'लॉगऑन' कार्रवाई? –

+0

@DarinDimitrov - मैंने अनुरोध के रूप में अपनी लॉगिन कार्रवाई को जोड़ा है। – soupy1976

+0

यह वही है जो मैं ढूंढ रहा हूं! आपकी मदद के लिए बहुत समय बचाया – JosephDoggie

उत्तर

3

ठीक है, अब मुझे पता चला है कि मैं कहां गलत हो रहा था। समस्या यह है कि मैं एक गुंडा का एक सा जा रहा था था और मैं पूरी तरह से समझ में नहीं आया कि क्या हो रहा है जब मैं कर रहा था:

filterContext.Result = new RedirectResult(verifyEmailUrl); 

मुझे नहीं पता था कि मैं वास्तव में इस के साथ एक नया अनुरोध शुरू कर रहा हूँ, मैंने गलती से सोचा कि मैं सिर्फ एक और कार्रवाई पर पुनर्निर्देशित कर रहा था। अब यह स्पष्ट प्रतीत होता है कि यह एक नया अनुरोध होगा।

तो, समस्या यह थी कि मेरी EmailVerificationRequired कार्रवाई उपयोगकर्ता को अधिकृत नहीं कर रही थी, और इस प्रकार जब यह इस क्रिया को प्राप्त हुआ तो वर्तमान उपयोगकर्ता शून्य था। तो फिक्स उस क्रिया के लिए प्राधिकरण जोड़ना था और अब यह ठीक है।

आपकी मदद लोगों के लिए धन्यवाद।

0

आप अपने लॉगिन ActionResult में इस संभाल कर सकते हैं। इस लाइन के बाद तुरंत

 if (_applicationService.CurrentUser.EmailVerified != true) 
     { 
      FormsAuthentication.SignOut(); 
      return RedirectToAction("EmailVerificationRequired", "Account"); 
     } 

कोड रखने का प्रयास करें:

_formsAuthenticationService.SetAuthCookie(model.LoginEmailAddress, model.RememberMe);  

इसके बाद, सेट breakpoints और लॉग इन कार्रवाई से निकलते हैं। यदि आप if (_applicationService.CurrentUser.EmailVerified! = True) लाइन तक नहीं पहुंचते हैं तो यह इंगित करता है कि आपका उपयोगकर्ता प्रमाणित नहीं है, और आपके पास संबोधित करने के लिए एक अलग समस्या है।

+1

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

+0

@ soupy1976 आपकी टिप्पणी के आधार पर, मैंने कोड नमूना संपादित किया ताकि उपयोगकर्ता को साइट के सुरक्षित हिस्सों तक प्रमाणीकृत और ईमेल सत्यापित किए बिना साइट को सुरक्षित रखने से रोका जा सके। उम्मीद है की यह मदद करेगा। आपकी सहायता टार्ज़न के लिए – Tarzan

+0

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