Как реализовать ссылку «Выход из системы» с помощью ASP.NET MVC? - PullRequest
1 голос
/ 21 октября 2008

Это кажется довольно глупым вопросом, но я пытаюсь найти лучший способ сделать это. Вы бы просто перенаправили на страницу / Logout и попросили бы контроллер вызвать функцию FormsAuthentication.SignOut?

Это была моя первая мысль, но потом я подумал, может ли она использоваться сторонними веб-сайтами. Допустим, кто-то просто решил опубликовать ссылку на вашу страницу / Выйти. Пользователь выйдет из вашего приложения. Есть ли хороший способ предотвратить это?

Ответы [ 7 ]

5 голосов
/ 21 октября 2008

Такая вредоносная ссылка будет примером класса уязвимостей безопасности, известных как подделка межсайтовых запросов, CSRF. Ссылка на выход из системы является относительно безвредной, но удаленный сайт может настроить несколько скрытых форм и опубликовать их на своем сайте, чтобы выполнить любое действие, возможное через POST.

Самая распространенная контрмера заключается в том, чтобы включить в каждую форму запрос, случайное скрытое значение, а затем проверить это значение. Проверка заголовка реферера может сработать, но учтите, что некоторые браузеры вообще не отправляют реферер.

Подробнее: http://en.wikipedia.org/wiki/Cross-site_request_forgery

4 голосов
/ 21 октября 2008

Если вы обеспокоены тем, что пользователь случайно вышел из вашего приложения по вредоносной ссылке, вы можете проверить Реферера, чтобы убедиться, что он выходит с вашего сайта (или имеет значение NULL в случае, если пользователь просто вводит URL в).

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

3 голосов
/ 21 октября 2008

Это то, что я использую.

public ActionResult Logout()
{
    FormsAuthentication.SignOut();
    return RedirectToAction("Index", "Home");
}

Кажется, работает нормально.

Сторонние веб-сайты будут только выходить из системы. Таким образом, они не добьются ничего, кроме реального выхода из системы.

2 голосов
/ 21 октября 2008

Новая бета-версия ASP.net MVC содержит AccountController, на который, возможно, стоит обратить внимание, поскольку он по существу реализует все: от регистрации до входа в систему / выхода из системы и забытого пароля. Не уверен, насколько это хорошо, но, конечно, хорошая отправная точка.

1 голос
/ 13 мая 2014

Это старый вопрос, но вот современный пример с MVC:

[Authorize]
public RedirectResult Logout()
{
    FormsAuthentication.SignOut();

    return this.Redirect("/");
}

Вы можете убедиться, что действие Logout может вызвать только тот, кто вошел в систему, применив к нему атрибут Authorize.

1 голос
/ 21 октября 2008

Получено из ActionResult

public class LogoutResult : ActionResult
{
    private readonly IAuthenticationService _authenticationService;
    private readonly IWebContext _context;

    public LogoutResult(IAuthenticationService authenticationService, IWebContext context)
    {
        _authenticationService = authenticationService;
        _context = context;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        _authenticationService.Logout();
        _context.Abandon();
        _context.Redirect("~/");
    }
}
0 голосов
/ 21 октября 2008

Вы должны искать cookie или что-то, что идентифицирует клиента как истинного пользователя.

...