Можно ли создать собственную аутентификацию без стандартных классов и пространств имен? - PullRequest
2 голосов
/ 28 марта 2012

Я создал пустое веб-приложение Asp.Net-MVC 3 и хочу написать свою очень простую аутентификацию.Создана база данных, где будет храниться вся информация о пользователях.Создан контроллер, просмотр с текстовыми полями для логина и пароля.Теперь пользователь открывает мой сайт, вводит свой логин и пароль, эта информация поступает на сервер и обрабатывается (с помощью моего собственного метода ValidateUser).Где я должен хранить информацию об этом пользователе для дальнейшего использования?

Если вы не поняли, что я хочу, тогда возникает вопрос: могу ли я реализовать свой собственный процесс аутентификации без использования стандартных MembershipRoles и MembershipProviders?

Ответы [ 4 ]

1 голос
/ 28 марта 2012

Конечно, вы можете - и ответ на первую часть вашего вопроса «это зависит». Это зависит от того, как / когда вы хотите его использовать.

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

Как предостережение - вам понадобится веская причина, чтобы реализовать это самостоятельно - очень легко ошибиться и оставить дыры в вашем сайте.

1 голос
/ 28 марта 2012

Вы можете написать свой собственный MemberShipProvider и вызвать собственный метод ValidateUser.

Отметьте это Реализация провайдера членства

Если вы так поступите, то сможете воспользоваться такими преимуществами, как

  1. Перенаправление на страницу входа в систему, если не аутентифицировано, установив это в конфигурационном файле
  2. После входа в систему вы можете использовать URL-адрес возврата, чтобы перенаправить обратно на ту же страницу, где находился пользователь.
1 голос
/ 28 марта 2012

В действии контроллера, к которому вы отправляете форму входа в систему, вы можете проверить учетные данные в вашей базе данных и в случае успеха создать файл cookie для аутентификации, который будет содержать имя пользователя подключенного в данный момент пользователя, чтобы вы могли получить его в последующих действиях.

Например, если у вас есть форма, содержащая поля имени пользователя и пароля, которая публикуется в методе LogOn:

[HttpPost]
public ActionResult LogOn(string username, string password)
{
    // TODO: up to you to implement the VerifyCredentials method
    if (!VerifyCredentials(username, password))
    {
        // wrong username or password:
        ModelState.AddModelError("", "wrong username or password");
        return View();
    }

    // username and password match => emit an authentication cookie:
    FormsAuthentication.SetAuthCookie(username, false);

    // and redirect to some controller action which is protected by the
    // [Authorize] attribute and which should be accessible only to 
    // authenticated users
    return RedirectToAction("SomeProtectedAction", "SomeController");
}

и внутри защищенного действия вы можете получить текущее подключенное имя пользователя из cookie, например:

[Authorize]
public ActionResult SomeProtectedAction()
{
    string username = User.Identity.Name;

    // TODO: here you could query your database to find out more about 
    // the user given his username which must be unique
    ...
}
0 голосов
/ 28 марта 2012

Да, это вполне возможно (здесь мы не используем аутентификацию форм).

Но;вам необходимо взять на себя полную ответственность за все , включая:

  • аутентификация
  • безопасное хранение / обработка некоторого токена против пользователя (обычно только для http)cookie)
  • проверка токена / пользователя по ресурсам
  • аннулирование токенов (либо для предотвращения воспроизведения, либо для выхода из системы)
  • все операции кэширования, задействованные в любом из этих
  • и все, что идет не так (включая, но не ограничиваясь этим, плохая реализация может привести к критической ошибке безопасности), является полностью вашей ошибкой

определенно очень достижимо, но требуетдолжно быть сделано по уважительным причинам и тщательно.

(что не так с ?admin=true, а?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...