2013-04-15 10 views
12

मैं सिर्फ एक कॉलेज प्रोजेक्ट लपेट रहा हूं, मुझे यकीन नहीं है कि मैं अपने कंप्यूटर पर बहुत लंबे समय से देख रहा हूं और कुछ याद आ रहा हूं, लेकिन जब मैं कोशिश करता हूं किसी उपयोगकर्ता को लॉग आउट करने के लिए, मुझे URL/खाता/LogOff के लिए 404 नहीं मिला है।एमवीसी 4 - लॉगऑफ नियंत्रक कार्रवाई 404 नहीं मिला

मैं एक नेविगेशन बार है कि लॉग इन से पता चलता है/पर एक उपयोगकर्ता है कि क्या आधार पर लॉग आउट करें, में लॉग इन, या, लॉग आउट: डिफ़ॉल्ट logoff कार्रवाई है कि इंटरनेट के साथ आता है

<div class="nav-collapse collapse"> 
    <ul class="nav pull-right"> 
     <li class="dropdown" id="dropdown-login-div"> 
      @if (!Request.IsAuthenticated) 
      { 
       <a class="dropdown-toggle" href="#" data-toggle="dropdown">Sign In <strong class="caret"></strong></a> 
      } 
      else 
      { 
       @Html.ActionLink("Log Off", "LogOff", "Account") 
      } 
      <div class="dropdown-menu" id="dropdown-login"> 
       @Html.Partial("~/Views/Account/_LoginPartial.cshtml", new ViewDataDictionary<LetLord.Models.LoginModel>()) 
      </div> 
     </li> 
    </ul> 
</div> 

अपने खाता नियंत्रक में टेम्पलेट:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult LogOff() 
{ 
    WebSecurity.Logout(); 

    return View("Index"); 
} 

क्या कोई मुझे बता सकता है कि यह क्यों हो रहा है - इससे पहले कि मैं अपने लैपटॉप को दीवार के खिलाफ फेंक दूं। चीयर्स।

उत्तर

39

आप जो HTTP GET अनुरोध में परिणाम है जब उपयोगकर्ता इस पर क्लिक करते हैं लेकिन अपनी कार्रवाई पोस्ट केवल अनुरोध सेवा करने के लिए विवश है लॉग ऑफ करने के लिए एक लिंक (<a/> टैग) का उपयोग (क्योंकि यह [HttpPost] विशेषता से सजाया गया है) ।

आपको या तो अपने लिंक को एक फॉर्म में डालने और POST अनुरोध उत्पन्न करने की आवश्यकता है, या [HttpPost] और [ValidateAntiForgeryToken] (गैलेक्टिक काउबॉय को क्रेडिट) को अपनी क्रिया से हटा दें।

+0

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

+0

'ValidateAntiForgeryToken' विफल हो जाएगा क्योंकि यह एक फॉर्म पोस्ट भी नहीं है। – GalacticCowboy

+0

पूरी तरह से मेरे सिर पर चला गया। धन्यवाद। – MattSull

28

के बाद से लॉगआउट सर्वर राज्य को संशोधित करता है, मैं को दूर नहीं होगा [HttpPost] और [ValidateAntiForgeryToken] इसके बजाय मैं निम्नलिखित

@using (Html.BeginForm("Log Out", "Account", FormMethod.Post, 
new { id = "logoutForm" })) 
{ 

    @Html.AntiForgeryToken() 
    <a href="javascript:document.getElementById('logoutForm').submit()">Log Out</a> 

} 
+0

बहुत अच्छा समाधान दोस्त, कार्यान्वित करने में आसान और समस्या बताता है। धन्यवाद! – Gent

0

मैं लेगेसी एप्लिकेशन पर इस समस्या में भाग के साथ लिंक (एंकर टैग) का स्थान ले लेगा । जिस तरह से मैंने इसे ठीक किया था, यह पता लगाना था कि आपूर्ति की गई वापसी यूआरएल '/ खाता/लॉगऑफ' थी और तदनुसार कार्य करें। 'AccountController.cs' फ़ाइल से 'लॉग इन' विधि:

if (returnUrl == "/Account/LogOff") 
    { 
     return this.RedirectToLocal(null); 
    } 
    else 
    { 
     return this.RedirectToLocal(returnUrl); 
    }  
संबंधित मुद्दे