将 Forms 身份验证用于 ASP.NET AJAX
更新:2007 年 11 月
您可以使用 Microsoft AJAX Library 应用程序身份验证服务来验证存储为 ASP.NET 成员资格服务的一部分的凭据。
本主题演示如何使用 JavaScript 从浏览器调用应用程序身份验证服务。
您可以通过使用 AuthenticationService 类,从客户端脚本访问身份验证服务,该类支持以下方法:
登录。此方法可使用默认的成员资格提供程序验证用户凭据。凭据验证完毕后,该方法会向浏览器发送一个 Forms 身份验证 Cookie。多数 ASP.NET AJAX 应用程序都使用登录方法,因为 Forms 身份验证应用程序要求浏览器中要有身份验证 cookie。
注销。此方法清除 Forms 身份验证 Cookie。
配置服务器
服务器提供了用于处理并验证标识凭据(如用户的名称和密码)的基础结构。ASP.NET 中的 Forms 身份验证功能使您可以使用登录窗体来验证用户的登录名和密码。如果应用程序对请求进行验证,则服务器会颁发一个票证,该票证包含用于在后续请求中重建用户标识的密钥。
AuthenticationService 类提供了 JavaScript 代理类,您可以从客户端脚本调用该代理类,从而与服务器上的身份验证服务通信。
说明: |
---|
您可以创建自己的服务器身份验证服务。有关更多信息,请参见 AuthenticationServiceManager。 |
若要在客户端脚本中支持身份验证,则必须按以下部分中的介绍配置服务器。
有关 ASP.NET 中的身份验证的更多信息,请参见 ASP.NET 安全性的工作原理和使用成员资格管理用户。
启用身份验证服务
若要从客户端脚本使用身份验证服务,则您必须使用应用程序的 Web.config 文件中的以下元素来显式启用身份验证服务:
<system.web.extensions>
<scripting>
<webServices>
<authenticationService enabled="true" />
</webServices>
</scripting>
</system.web.extensions>
有关更多信息,请参见如何:在 ASP.NET AJAX 中配置 ASP.NET 服务。
身份验证服务需要启用 Forms 身份验证。下面的示例演示如何在应用程序的 Web.config 文件中启用 Forms 身份验证。
<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 的关联事件处理程序的按钮。该方法处理程序中的代码可调用 AuthenticationService 类的 login 方法。
您登录之后,按钮文本会发生更改,页顶部的文本也会发生更改,以指示您的登录状态。单击页底部的链接以移到位于 Secured 文件夹中的页。由于您现在已登录,因此可以访问此文件夹中的页,而不会重定向到登录页。
在示例页上,您可以单击按钮以注销。这将调用 OnClickLogout 按钮事件处理程序,该处理程序会调用 logout 方法。注销后,页顶部的文本会发生更改。如果您试图访问 Secured 文件夹中的页,则会被重定向到登录页,因为您的浏览器已不再有 Forms 身份验证 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 AJAX 中配置 ASP.NET 服务
概念
Sys.Services.AuthenticationService 类