Доступ к проверке подлинности ASP.NET на клиенте (через JavaScript) - PullRequest
4 голосов
/ 24 февраля 2010

У меня есть веб-сайт ASP.NET, который использует проверку подлинности с помощью форм

    <authentication mode="Forms">
        <forms name="NewsCoreAuthentication" loginUrl="~/Default.aspx" defaultUrl="~/Default.aspx" protection="Validation" timeout="300" domain="someRootDomain.com" />
    </authentication>

Мне нужно определить, прошел ли аутентификация пользователя на веб-странице после его передачи клиенту. Для этого я подумал, что могу прочитать document.cookie и проверить, есть ли «.ASPXAUTH». Но проблема в том, что даже если я подписан, это значение равно пусто .

Как я могу проверить, что пользователь аутентифицирован? Почему document.cookie пуст?


Спасибо за ответы. blowdart помог мне понять, почему билет аутентификации не доступен из клиентского скрипта.

Ответы [ 3 ]

5 голосов
/ 25 февраля 2010

Причина, по которой он пуст, в том, что cookie-файл защищен пометкой HttpOnly. Это означает, что к нему нельзя получить доступ через скрипт. Отключить это очень и очень плохая идея, поскольку уязвимости XSS на вашем сайте могут привести к краже файлов cookie, поэтому я не буду рассказывать вам, как вы можете это сделать.

1 голос
/ 01 марта 2010

Как уже говорили другие, авторизационный билет должен и ДОЛЖЕН быть httponly.

Лучший способ сделать это - использовать ApplicationServices. Конечная точка аутентификации JSON предоставляет доступ к IsLoggedIn, и я заметил, что вы обеспокоены загрузкой сервера. Затраты на вызов статической конечной точки, которая просто проверяет cookie для вас, незначительны. На самом деле.

Итак, если вы используете MsAjax, просто включите службы приложений и вызовите Sys.Services.AuthenticationService.IsLoggedIn.

Если вы хотите сделать это из необработанного JavaScript, вот код:;)

Добавьте этот сегмент в ваш конфигурационный файл

  <system.web>
     ------------
  </system.web>
  <system.web.extensions>
    <scripting>
      <webServices>
        <authenticationService enabled ="true" requireSSL="false"/>
      </webServices>
    </scripting>
  </system.web.extensions>

Страница ....

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>

    <script type="text/javascript">
        function createXHR() {
            // a memoizing XMLHttpRequest factory.
            var xhr;
            var factories = [
                    function() { return new XMLHttpRequest(); },
                    function() { return new ActiveXObject("Msxml2.XMLHTTP"); },
                    function() { return new ActiveXObject("Msxml3.XMLHTTP"); },
                    function() { return new ActiveXObject("Microsoft.XMLHTTP"); } ];
            for (var i = 0; i < factories.length; i++) {
                try {
                    xhr = factories[i]();
                    // memoize the factory so we don't have to look for it again.
                    createXHR = factories[i];
                    return xhr;
                } catch (e) { }
            }
        }

        function isLoggedIn() {
            var xhr = createXHR();
            xhr.open("POST", "/Authentication_JSON_AppService.axd/IsLoggedIn", true);
            xhr.onreadystatechange = function() {
                if (this.readyState === 4) {
                    if (this.status != 200) {
                        alert(xhr.statusText);
                    } else {
                        alert("IsLoggedIn = " + xhr.responseText);
                    }
                    xhr = null;
                }
            };
            xhr.setRequestHeader("content-type", "application/json");
            xhr.send(null);
        }
    </script>

</head>
<body>
    <input type="button" value="IsLoggedIn?" onclick="isLoggedIn()" />
</body>
</html>
0 голосов
/ 25 февраля 2010

Номер один ... это плохая идея. Нет абсолютно никакой безопасности при проверке, авторизован ли пользователь на стороне клиента. Ни один.

Но если вы действительно хотите это сделать ... выполните проверку кода и отправьте клиенту значение, которое можно прочитать через Javascript. Что-то похожее на:

RegisterClientScript ("isvalidated", "var isUserAuthenticated =" + UserAuthenticated);

Вы видите проблему сейчас? Вы можете сделать то же самое в AJAX ... но у него та же проблема.

ОК, я вижу в этом простое удобство для пользователя ... показывая определенные ссылки, если они авторизованы, например. Но это не безопасно ни в какой форме или форме. Просто сделайте себе одолжение и обработайте это в коде.

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