2014-01-28 3 views
5

Я следующий контроллер автоматически генерируется asp.netASP.NET MVC сообщение для @ Url.action()

// 
    // POST: /Account/LogOff 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     AuthenticationManager.SignOut(); 
     return RedirectToAction("Index", "Home"); 
    } 

Теперь у меня есть кнопка журнал выключен. В настоящее время это выглядит следующим образом:

<div class="userdrop"> 
       <ul> 
        <li><a href="@Url.Action("Manage", "Account")">Profile</a></li>      
        <li><a href="@Url.Action("LogOff", "Account")">Logout</a></li> 
       </ul> 
      </div><!--userdrop--> 

Но это не работает, и я предполагаю, что это является причиной, это метод действия Post.

Как я могу «выходить из системы»?

[EDIT]

Почему это автоматически генерируется как HTTP Post? Это более безопасно? Не отправляет ли он cookie с ним при выходе из системы?

ответ

9

Как бы идти о "выходе из системы"?

Используя форму вместо якоря:

<li> 
    @using (Html.BeginForm("LogOff", "Account")) 
    { 
     @Html.AntiForgeryToken() 
     <button type="submit">Logout</button> 
    } 
</li> 

Вы могли бы назвать CSS мастера к стилю эта кнопка выглядит как якорь, если вы хотите. Но семантически правильный элемент в этом случае представляет собой html-форму, которая позволяет вам отправлять POST-глагол.

+1

+1 для кода кнопки «отправить» - и в качестве примечания здесь у меня были значительные проблемы с «AntiForgeryToken» в средах с общим балансированием нагрузки. Вы знаете решение этой проблемы? Вот почему я прекратил включать его в свои формы, и мне это совсем не нравится. Вероятно, OP тоже может. –

+0

@ darin Хорошее решение. В любом случае, чтобы оба элемента были одинаковыми? Как мой css теперь отображает кнопку, а не тот же вид, что и выше? – Zapnologica

+1

Думаю, я ответил на свой вопрос, посмотрев еще один ответ. Ключ должен поставить 'machineKey' в' Web.config', чтобы он был согласован во всех экземплярах приложения. Я должен был сделать это, чтобы решить другую проблему, проблему «Keep me logged in». Теперь я удивляюсь этому - какие риски связаны с этим? –

7

Для этого нет веской причины быть HttpPost. Я знаю, что это сгенерировано таким образом, но вы не на самом деле POST каких-либо данных. Просто удалите атрибут, и он будет работать как есть.

Теперь, если вы хотите работать с HttpPost, то вам нужно обернуть это в Form и сделать его submit кнопку илиsubmit форме onclick.

<li> 
    @using (Html.BeginForm("LogOff", "Account", 
     FormMethod.Post, new { id = "LogOffForm" })) 
    { 
     @Html.AntiForgeryToken() 
     <a href="@Url.Action("LogOff", "Account")" 
      onclick="$('#LogOffForm').submit();">Logout</a> 
    } 
</li> 
+0

+ 1 для другого обходного пути. Некоторым фреймворкам и шаблонам CSS не понравится добавленная там. Действие LogOff также требует по умолчанию поля формы для защиты от подделки «__RequestVerificationToken». Также необходимо удалить атрибут [ValidateAntiForgeryToken]. Я боролся с последствиями этого abit .... но в конце концов, он ограничен DE-Auth – PortageMonkey

+0

Есть ли проблемы с безопасностью при удалении токена анти-подделки и в получении, а не в сообщении? – Zapnologica

+0

POST следует использовать, чтобы он заставлял браузер ударяться о сервер. Используя GET, браузер может использовать кешированную копию и не правильно регистрировать пользователя с сервера. –

3

Вы правы, что это связано с атрибутом [HttpPost], который разрешает только HTTP-запросы POST. Регулярные HTML-привязки запускают HTTP-запросы GET, поэтому ваш пример не работает.

Одно решение было бы что-то вроде этого:

@using (Html.BeginForm("LogOff", "Account", FormMethod.Post, 
      new { id = "logoutForm" })) { 
    @Html.AntiForgeryToken() 
    <button type="submit">Log off</button> 
} 

Я считаю, что это близко к тому, что шаблон по умолчанию делает в MVC4.

Обратите внимание, что мы также передаем токен анти-подделки, требуемый атрибутом [ValidateAntiForgeryToken].

+0

+1 для решения, которое не требует 'jQuery': D –

+0

@MichaelPerrenoud LOL, теперь я полностью исключил необходимость JS. –

Смежные вопросы