Авторизация на основе файлов cookie C #

Я реализую авторизацию C # с использованием файлов cookie jquery для своей страницы. Я устанавливаю / шифрую имя пользователя и пароль в cookie и на моей странице администратора, если я распознаю cookie, то пользователь авторизован. Если нет, он перенаправляется на страницу входа. Проблема в том, что этот файл cookie считывается после загрузки страницы, поэтому я могу вручную открыть страницу администратора, и только через пару секунд он будет перенаправлен. Как предотвратить загрузку страницы администратора для посетителей, у которых еще нет файлов cookie? Какова правильная архитектура авторизации на основе файлов cookie?

Примечание. Я не использую роли ASP.NET или пользовательские таблицы. Я реализовал свои собственные таблицы для пользователей.


person Stewie Griffin    schedule 20.06.2011    source источник


Ответы (2)


Я подозреваю, что вы заново изобретаете колесо. Вам не нужно использовать поставщик членства и схему членства в ASP.Net, чтобы воспользоваться преимуществами проверки подлинности с помощью форм. Когда пользователь входит в систему, просто перетащите на него Auth Ticket (cookie), и все готово. Затем вы можете просто выполнить проверку администратора на странице администратора.

Некоторые предложения ниже ...

Изменить: я изначально разместил средства хранения ролей в Auth Ticket через UserData, но я думаю, что это излишне для этой ситуации.

Web.config:

<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" timeout="30" slidingExpiration="true" />
</authentication>
. . .
<membership>
  <providers>
    <clear />
  </providers>
</membership>

Выполнить вход: когда пользователь отправляет свое имя пользователя и пароль, подтвердите их и проверьте, является ли он администратором:

if (UserIsValid(username, pwd)) // some validation call
{
    FormsAuthentication.SetAuthCookie(username, true);
}

Admin.aspx: Наконец, быстрый взлом для ограничения доступа к странице администратора. Когда страница загрузится, убедитесь, что пользователь является / не является администратором:

if (!IsAdmin(User.Identity.Name)) // some admin call
    Response.Redirect("Default.aspx");
person Brett    schedule 20.06.2011
comment
Так что поправьте меня, если я ошибаюсь: здесь мы устанавливаем cookie из кода, который защитит меня от тех случаев, когда у пользователя отключен js. Правильно? В противном случае я все еще мог бы устанавливать файлы cookie с помощью jQuery и читать их в коде позади .. но я бы игнорировал пользователей без js в этом случае - person Stewie Griffin; 21.06.2011
comment
Установка cookie аутентификации на стороне клиента небезопасна. Вы не можете зашифровать его, поэтому его можно подделать. Если вы не отправляете какой-то AJAX-сообщение обратно на сервер, а затем отбрасываете зашифрованный ответ в виде файла cookie? Суть в том, что полезные данные cookie должны быть зашифрованы сервером, иначе любой может выдать себя за пользователя. - person Brett; 21.06.2011
comment
@Stewie Griffin: Я упростил сценарий. Хранение данных в UserData, вероятно, является излишним для этого сценария. - person Brett; 21.06.2011

Проблема в том, что для проверки безопасности вы используете код на стороне клиента. Если кто-то полностью отключит JavaScript, его никогда не перенаправят. Перенесите чек в код на стороне сервера.

person nfechner    schedule 20.06.2011
comment
вы говорите, что я вообще не должен использовать куки для синтаксического анализа пользователя? если да, то что мне использовать? Сессия? - person Stewie Griffin; 20.06.2011
comment
В принципе, да: используйте сеансы для хранения флага входа и отправки идентификатора сеанса в виде файла cookie пользователю (большинство фреймворков все равно сделают это за вас, что является большим преимуществом использования сеансов :-)). - person nfechner; 20.06.2011
comment
Ваш ответ правильный, но я хочу реализовать его с помощью файлов cookie. Кроме того, весь веб-сайт (и все остальные 90% веб-сайтов в Интернете) не будет работать, если пользователь отключит javascript. - person Stewie Griffin; 21.06.2011