Вход и выход

Поддержка механизма ASP.NET AJAX Forms Authentication осуществляется двумя методами класса Sys.Services.AuthenticationService: login() и logout(). Начнем с операции входа пользователя. При вызове этому методу должно быть передано не менее восьми параметров:
userName
Имя пользователя
password
Пароль
isPersistent
Должен ли cookie системы аутентификации постоянно храниться на стороне клиента (по умолчанию false)
redirectUrl
Адрес URL, куда должен быть перенаправлен броузер после входа пользователя, или null, если перенаправление не требуется (по умолчанию)
customInfo
В настоящее время не используется
loginCompletedCallback
Функция, которая вызывается после успешного входа
failedCallback
Функция, которая вызывается в случае неудачной попытки входа
userContext
Данные, которые передаются функциям обратного вызова

Существуют два варианта реализации процедуры аутентификации:
1. Вызвать метод login() и разрешить JavaScript выполнить перенаправление на другую страницу, установив значение аргумента redirectUrl.
2. Вызвать метод login() и с помощью функций обратного вызова loginCompletedCallback() и failedCallback() обработать результаты аутентификации.

Чаще на практике используется второй вариант.


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

Выход пользователя производится с помощью метода logout(). Он поддерживает «только» четыре аргумента:
redirectUrl
Адрес URL, куда должен быть перенаправлен броузер после выхода пользователя, или null, если перенаправление не требуется (по умолчанию)
logoutCompletedCallback
Функция, которая вызывается после успешного выхода
failedCallback
Функция, которая вызывается в случае неудачной попытки выхода
userContext
Данные, которые передаются функциям обратного вызова
Теперь на основе файла ProfileGroup.aspx
создадим новый файл Authentication.aspx и добавим в него эти две функции. Напомню, что страница ProfileGroup.aspx содержит форму регистрации пользователя и позволяет сохранять имя пользователя и пароль в переменных профиля. В предыдущих примерах кнопка на форме не имела никакой функциональности. Поэтому, перед тем как добавить функциональность, сначала удалим фиктивный код JavaScript, связанный с этой кнопкой, чтобы разметка приняла следующий вид:


В функцию pageLoad() вставляем обработчик событий от кнопки:
$addHandler(
$get("Button1"),
"click",
doClick);

Функция doClick(), на которую ссылается вышеприведенный фрагмент, проверяет надпись на кнопке.


Если это строка "Login", выполняется попытка входа пользователя, если "Logout" – производится попытка выхода.

Теперь необходимо соответствующим образом установить аргументы методов login() и logout(). Поскольку информация о пользователях постоянно хранится в профиле, нам не требуется сохранять информацию о вошедшем пользователе. Кроме того, мы не будем выполнять перенаправление пользователя после входа или после выхода. Наконец, мы воспользуемся приемом, и определим значения для аргумента userContext, чтобы можно было повторно использовать одни и те же функции обратного вызова для операций входа и выхода.

function doClick( ) {
switch ($get("Button1").value) {
case "Login":
Sys.Services.AuthenticationService.login(
$get("txtUsername").value,
$get("txtPassword").value,
false,
null,
null,
loginComplete,
loginError,
"login");
break;
case "Logout":
Sys.Services.AuthenticationService.logout(
null,
loginComplete,
loginError,
"logout");
break;
}
}

Функция loginError() обрабатывает такие ошибки при входе и выходе, как неверное имя пользователя или пароль, отсутствие имени пользователя или неправильные настройки на сервере.


Соответствующее сообщение об ошибке будет отображаться в метке HTML:

function loginError(result, context) {
$get("statusText").firstChild.nodeValue =
"Could not " + context + " (" +
result.get_message( ) + ").";
}

Наконец, функция loginComplete() выводит сообщение о состоянии операции. Кроме того, она изменяет форму регистрации. После успешного входа пользователя оба текстовых поля делаются недоступными для ввода, а надпись "login" на кнопке изменяется на "logout". После того как пользователь совершит выход, надпись на кнопке опять изменится на "login", а оба текстовых поля станут доступными для ввода.

function loginComplete(result, context) {
switch (context) {
case "login":
if (result == true) {
$get("txtUsername").disabled = true;
$get("txtPassword").disabled = true;
$get("Button1").value = "Logout";
$get("statusText").firstChild.nodeValue = "Logged in";
} else {
$get("statusText").firstChild.nodeValue = "Login failed";
}
break;
case "logout":
$get("txtUsername").disabled = false;
$get("txtPassword").disabled = false;
$get("Button1").value = "Login";
$get("statusText").firstChild.nodeValue = "Logged out";
break;
}
}

Полный программный код этого примера приводится в примере 8.1.
Не забудьте внести в файл Web.config необходимые изменения, прежде чем опробовать этот пример.
Пример 8.1.


Аутентификация пользователя с помощью JavaScript
Authentication.aspx
<%@ Page Language="C#" %>
"http://www.w3.org/TR/ xhtml1/DTD/xhtml1?transitional.dtd"> ASP.NET AJAX

Check the configuration in web.config!";
}
function saveProfile1( ) {
Sys.Services.ProfileService.properties.UserData.myUserName =
$get("txtUsername").value;
Sys.Services.ProfileService.save(
null,
profileSaved,
profileError,
{"operation": "save", "property": "username"});
}
function saveProfile2( ) {
Sys.Services.ProfileService.properties.UserData.myPassword =
$get("txtPassword").value;
Sys.Services.ProfileService.save(
null,
profileSaved,
profileError,
{"operation": "save", "property": "password"});
}
function profileSaved(success, context) {
$get("statusText").firstChild.nodeValue = "Profile data (" +
context.property + ") saved.";
}
function doClick( ) {
switch ($get("Button1").value) {
case "Login":
Sys.Services.AuthenticationService.login(
$get("txtUsername").value,
$get("txtPassword").value,
false,
null,
null,
loginComplete,
loginError,
"login");
break;
case "Logout":
Sys.Services.AuthenticationService.logout(
null,
loginComplete,
loginError,
"logout");
break;
}
}
function loginComplete(result, context) {
switch (context) {
case "login":
if (result == true) {
$get("txtUsername").disabled = true;
$get("txtPassword").disabled = true;
$get("Button1").value = "Logout";
$get("statusText").firstChild.nodeValue = "Logged in";
} else {
$get("statusText").firstChild.nodeValue = "Login failed";
}
break;
case "logout":
$get("txtUsername").disabled = false;
$get("txtPassword").disabled = false;
$get("Button1").value = "Login";
$get("statusText").firstChild.nodeValue = "Logged out";
break;
}
}
function loginError(result, context) {
$get("statusText").firstChild.nodeValue =
"Could not " + context + " (" +
result.get_message( ) + ").";
}


(body)
(asp:ScriptManager ID="ScriptManager1" runat="server" /)

User name: (br /)
Password:
(br /)
(br /)
 


(/body)


Оцените статью: (0 голосов)
0 5 0

Статьи из раздела ASP.NET AJAX на эту тему:
Подготовка приложения