Использование проверки подлинности с помощью форм в ASP.NET AJAX
Обновлен: Ноябрь 2007
Для проверки учетных данных, хранящихся в составе службы членства ASP.NET, можно использовать службу проверки подлинности приложений Microsoft AJAX (библиотека).
В данном разделе показано, как вызвать службу проверки подлинности приложений из обозревателя с помощью JavaScript.
Обратиться к службе проверки подлинности из клиентского сценария можно с помощью класса AuthenticationService, поддерживающего следующие методы:
login. Этот метод проверяет учетные данные пользователя, используя поставщик членства по умолчанию. Если учетные данные прошли проверку, то метод отправляет обозревателю файл Cookie проверки подлинности с помощью форм. Большинство приложений ASP.NET AJAX будут использовать метод login, поскольку для приложений с проверкой подлинности с помощью форм в обозревателе должен присутствовать файл Cookie проверки подлинности.
logout. Этот метод очищает файл Cookie проверки подлинности с помощью форм.
Настройка сервера
Сервер предоставляет инфраструктуру для обработки таких пользовательских учетных данных идентификации, как имя и пароль, и для проверки этих учетных данных. Функция проверки подлинности с помощью форм в ASP.NET позволяет проводить проверку подлинности имени и пароля пользователя с помощью формы входа. Если приложение подтверждает подлинность запроса, то сервер выдает билет, содержащий ключ для восстановления удостоверения пользователя при последующих запросах.
Класс AuthenticationService предоставляет прокси-класс JavaScript, вызываемый из клиентского сценария с целью взаимодействия со службой проверки подлинности на сервере.
Примечание. |
---|
Также можно создать собственную серверную службу проверки подлинности. Дополнительные сведения см. в разделе AuthenticationServiceManager. |
Для поддержки проверки подлинности в клиентском сценарии сервер должен быть настроен в соответствии с описанием, приведенным в следующих разделах.
Дополнительные сведения о проверке подлинности в ASP.NET см. в разделах Система безопасности ASP.NET и Управление пользователями путем объединения их в группы.
Включение службы проверки подлинности
Для использования службы проверки подлинности из клиентского сценария необходимо в явной форме включить ее с помощью следующего элемента в файле Web.config приложения:
<system.web.extensions>
<scripting>
<webServices>
<authenticationService enabled="true" />
</webServices>
</scripting>
</system.web.extensions>
Дополнительные сведения см. в разделе Практическое руководство. Конфигурация служб ASP.NET в ASP.NET AJAX.
Для службы проверки подлинности необходимо, чтобы была включена проверка подлинности с помощью форм. В следующем примере показано, как включить проверку подлинности с помощью форм в файле Web.config приложения:
<system.web>
<authentication mode="Forms">
<forms cookieless="UseCookies"
loginUrl="~/login.aspx"/>
</authentication>
<system.web>
Примечание. |
---|
В обозревателе должны быть включены файлы Cookie. Служба проверки подлинности использует файл Cookie в качестве билета проверки подлинности, восстанавливающего удостоверение пользователя в ходе последующих запросов. |
Настройка доступа к базе данных членства
По умолчанию для хранения сведений о членстве ASP.NET использует базу данных SQL Server Express. Строка соединения базы данных определяется в файле Machine.config и имеет приблизительно следующий вид:
<connectionStrings>
<add name="LocalSqlServer"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;
AttachDBFilename=|DataDirectory|aspnetdb.mdf;
User Instance=true" providerName="System.Data.SqlClient" />
</connectionStrings>
Если для хранения сведений о членстве используется другая база данных, то в файле Web.config приложения можно создать элемент <connectionStrings>, указывающий на эту базу данных. Дополнительные сведения см. в разделе Настройка приложения ASP.NET для использования членства.
Создание папки с ограниченным доступом
Если необходимо ограничить доступ к сведениям, предоставляя его только вошедшим в систему пользователям, следует создать область узла с ограниченным доступом. Обычно это папка в корневом каталоге приложения. Чтобы ограничить к ней доступ, в ней следует создать файл Web.config и добавить в него раздел <authorization>. В следующем примере показано содержимое файла Web.config, предоставляющего доступ только пользователям, прошедшим проверку подлинности:
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
</system.web>
</configuration>
Пример
В следующем примере демонстрируется веб-страница ASP.NET, на которой проверка подлинности пользователя проводится с помощью клиентского сценария. В примере требуется настроить сервер так, как описано ранее в этом же разделе. Предполагается, что папка с ограниченным доступом имеет название Secured.
Страница содержит элемент <asp:ScriptManager>. Если этот элемент присутствует на странице, то во всех клиентских сценариях на странице будет автоматически доступен объект AuthenticationService.
На странице присутствует кнопка, с которой связан обработчик событий OnClickLogin. Код метода-обработчика вызывает метод login класса AuthenticationService.
После входа подпись кнопки изменяется, и текст в верхней части страницы также изменяется, отражая состояние входа. Щелкните ссылку в нижней части страницы, чтобы перейти к странице, расположенной в папке Secured. Поскольку вход теперь выполнен, обращаться к страницам в этой папке можно без перенаправления на страницу входа.
На странице примера можно нажать кнопку выхода. При этом будет вызван обработчик событий кнопки OnClickLogout, который вызывает метод logout. После выхода текст в верхней части страницы изменится. При попытке обращения к странице, расположенной в папке с ограниченным доступом, будет выполнено перенаправление на страницу входа, поскольку в обозревателе уже нет файла Cookie проверки подлинности с помощью форм.
Код примера предоставляет асинхронно завершающиеся функции обратного вызова для методов login и logout. Также можно создать для обоих методов функции обратного вызова, вызываемые в случае возникновения ошибки. Дополнительные сведения см. в примере, приведенном в разделе, посвященном общим сведениям о классе AuthenticationService.
<%@ Page Language="VB" %>
<!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 id="Head1" runat="server">
<title>Authentication Service</title>
<style type="text/css">
body { font: 11pt Trebuchet MS;
font-color: #000000;
padding-top: 72px;
text-align: center }
.text { font: 8pt Trebuchet MS }
</style>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager runat="server" ID="ScriptManagerId">
<Scripts>
<asp:ScriptReference Path="Authentication.js" />
</Scripts>
</asp:ScriptManager>
<h2>Authentication Service</h2>
<span id="loggedin"
style="visibility:hidden; color:Green; font-weight:bold; font-size:large"
visible="false"><b>You are logged in! </b>
</span>
<span id="notloggedin"
style="visibility:visible;color:Red; font-weight:bold; font-size:large">
You are logged out!
<br /> <br />
<span style="font-weight:normal; font-size:medium; color:Black">
Please, use one of the following [username, password]
combinations:<br />
[user1, u$er1] <br/>
[user2, u$er2] <br/>
[user3, u$er3]
</span>
</span>
<br /><br />
<div>
<table>
<tr id="NameId" style="visibility:visible;">
<td style="background-color:Yellow; font-weight:bold; color:Red">
User Name:
</td>
<td>
<input type="text" id="username"/>
</td>
</tr>
<tr id="PwdId" style="visibility:visible;">
<td style="background-color:Yellow; font-weight:bold; color:Red">
Password:
</td>
<td>
<input type="password" id="password" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<button id="ButtonLogin"
style="background-color:Aqua;"
onclick="OnClickLogin(); return false;">Login</button>
<button id="ButtonLogout"
style="background-color:Aqua; visibility:hidden;"
onclick="OnClickLogout(); return false;">Logout</button>
</td>
</tr>
</table>
<br />
<br />
<a href="secured/Default.aspx" target="_top2" >
Attempt to access a page
that requires authenticated users.</a>
<br />
<br />
<!-- <a href="CreateNewUser.aspx"><b>Create a new user.</b></a>
-->
</div>
</form>
<hr />
<div id="FeedBackID" style="visibility:visible" />
</body>
</html>
<%@ Page Language="C#" %>
<!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 runat="server">
<title>Authentication Service</title>
<style type="text/css">
body { font: 11pt Trebuchet MS;
font-color: #000000;
padding-top: 72px;
text-align: center }
.text { font: 8pt Trebuchet MS }
</style>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager runat="server" ID="ScriptManagerId">
<Scripts>
<asp:ScriptReference Path="Authentication.js" />
</Scripts>
</asp:ScriptManager>
<h2>Authentication Service</h2>
<span id="loggedin"
style="visibility:hidden; color:Green; font-weight:bold; font-size:large"
visible="false"><b>You are logged in! </b>
</span>
<span id="notloggedin"
style="visibility:visible;color:Red; font-weight:bold; font-size:large">
You are logged out!
<br /> <br />
<span style="font-weight:normal; font-size:medium; color:Black">
Please, use one of the following [username, password]
combinations:<br />
[user1, u$er1] <br/>
[user2, u$er2] <br/>
[user3, u$er3]
</span>
</span>
<br /><br />
<div>
<table>
<tr id="NameId" style="visibility:visible;">
<td style="background-color:Yellow; font-weight:bold; color:Red">
User Name:
</td>
<td>
<input type="text" id="username"/>
</td>
</tr>
<tr id="PwdId" style="visibility:visible;">
<td style="background-color:Yellow; font-weight:bold; color:Red">
Password:
</td>
<td>
<input type="password" id="password" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<button id="ButtonLogin"
style="background-color:Aqua;"
onclick="OnClickLogin(); return false;">Login</button>
<button id="ButtonLogout"
style="background-color:Aqua; visibility:hidden;"
onclick="OnClickLogout(); return false;">Logout</button>
</td>
</tr>
</table>
<br />
<br />
<a href="secured/Default.aspx" target="_top2" >
Attempt to access a page
that requires authenticated users.</a>
<br />
<br />
<!-- <a href="CreateNewUser.aspx"><b>Create a new user.</b></a>
-->
</div>
</form>
<hr />
<div id="FeedBackID" style="visibility:visible" />
</body>
</html>
var usernameEntry;
var passwordEntry;
var username;
var password;
var textLoggedIn;
var textNotLoggedIn;
var buttonLogin;
var buttonLogout;
function pageLoad()
{
usernameEntry = $get("NameId");
passwordEntry = $get("PwdId");
username = $get("username");
password = $get("password");
textLoggedIn = $get("loggedin");
textNotLoggedIn = $get("notloggedin");
buttonLogin = $get("ButtonLogin");
buttonLogout = $get("ButtonLogout");
}
// This function sets and gets the default
// login completed callback function.
function SetDefaultLoginCompletedCallBack()
{
// Set the default callback function.
Sys.Services.AuthenticationService.set_defaultLoginCompletedCallback(OnLoginCompleted);
// Get the default callback function.
var callBack =
Sys.Services.AuthenticationService.get_defaultLoginCompletedCallback();
}
// This function sets and gets the default
// logout completed callback function.
function SetDefaultLogoutCompletedCallBack()
{
// Set the default callback function.
Sys.Services.AuthenticationService.set_defaultLogoutCompletedCallback(OnLogoutCompleted);
// Get the default callback function.
var callBack =
Sys.Services.AuthenticationService.get_defaultLogoutCompletedCallback();
}
// This function sets and gets the default
// failed callback function.
function SetDefaultFailedCallBack()
{
// Set the default callback function.
Sys.Services.AuthenticationService.set_defaultFailedCallback(OnFailed);
// Get the default callback function.
var callBack =
Sys.Services.AuthenticationService.get_defaultFailedCallback();
}
// This function calls the login method of the
// authentication service to verify
// the credentials entered by the user.
// If the credentials are authenticated, the
// authentication service issues a forms
// authentication cookie.
function OnClickLogin()
{
// Set the default callback functions.
SetDefaultLoginCompletedCallBack();
SetDefaultLogoutCompletedCallBack();
SetDefaultFailedCallBack();
// Call the authetication service to authenticate
// the credentials entered by the user.
Sys.Services.AuthenticationService.login(username.value,
password.value, false,null,null,null,null,"User Context");
}
// This function calls the logout method of the
// authentication service to clear the forms
// authentication cookie.
function OnClickLogout()
{
// Clear the forms authentication cookie.
Sys.Services.AuthenticationService.logout(null,
null, null, null);
}
// This is the callback function called
// if the authentication fails.
function OnFailed(error,
userContext, methodName)
{
// Display feedback message.
DisplayInformation("error:message = " +
error.get_message());
DisplayInformation("error:timedOut = " +
error.get_timedOut());
DisplayInformation("error:statusCode = " +
error.get_statusCode());
}
// The callback function called
// if the authentication completed successfully.
function OnLoginCompleted(validCredentials,
userContext, methodName)
{
// Clear the user password.
password.value = "";
// On success there will be a forms
// authentication cookie in the browser.
if (validCredentials == true)
{
// Clear the user name.
username.value = "";
// Hide login fields.
buttonLogin.style.visibility = "hidden";
usernameEntry.style.visibility = "hidden";
passwordEntry.style.visibility = "hidden";
textNotLoggedIn.style.visibility = "hidden";
// Display logout fields.
buttonLogout.style.visibility = "visible";
textLoggedIn.style.visibility = "visible";
// Clear the feedback area.
DisplayInformation("");
}
else
{
textLoggedIn.style.visibility = "hidden";
textNotLoggedIn.style.visibility = "visible";
DisplayInformation(
"Login Credentials Invalid. Could not login");
}
}
// This is the callback function called
// if the user logged out successfully.
function OnLogoutCompleted(result)
{
// Display login fields.
usernameEntry.style.visibility = "visible";
passwordEntry.style.visibility = "visible";
textNotLoggedIn.style.visibility = "visible";
buttonLogin.style.visibility = "visible";
// Hide logout fields.
buttonLogout.style.visibility = "hidden";
textLoggedIn.style.visibility = "hidden";
}
// This function displays feedback
// information for the user.
function DisplayInformation(text)
{
document.getElementById("FeedBackID").innerHTML =
"<br/>" + text;
// Display authentication service information.
var userLoggedIn =
Sys.Services.AuthenticationService.get_isLoggedIn();
var authServiceTimeout =
Sys.Services.AuthenticationService.get_timeout();
var userLoggedInfo =
"<br/> User logged in: " + userLoggedIn;
var timeOutInfo =
"<br/> Authentication service timeout: " + authServiceTimeout;
document.getElementById("FeedBackID").innerHTML =
userLoggedInfo + timeOutInfo;
}
if (typeof(Sys) !== "undefined") Sys.Application.notifyScriptLoaded();
См. также
Задачи
Практическое руководство. Конфигурация служб ASP.NET в ASP.NET AJAX
Основные понятия
Использование веб-служб в технологии AJAX ASP.NET
Вызов веб-служб из клиентского сценария
Использование информации ролей с помощью ASP.NET AJAX
Использование сведений о профиле с ASP.NET AJAX
Класс Sys.Services.AuthenticationService
Класс Sys.Services.ProfileService
Настройка приложения ASP.NET для использования членства