本文来自《ASP.NET AJAX程序设计 第II卷:客户端Microsoft AJAX Library相关》的第五章《应用程序服务和本地化》。
实现用户管理是几乎每一个网站都要考虑的问题,ASP.NET 2.0为此特意内建了身份认证应用程序服务,并以统一的方式提供给开发者。身份认证应用程序服务不但使用起来非常简单,也在同时提供了足够灵活的扩展能力。
参考:若想了解更多有关ASP.NET 2.0的身份认证服务,请参考这两篇MSDN文章:《How ASP.NET Security Works 》(http://msdn2.microsoft.com/en-us/library/78d5caaf-055e-41f1-bbde-1b5020775edb.aspx)和《Managing Users by Using Membership 》(http://msdn2.microsoft.com/en-us/library/824c3a24-f0af-427c-a652-0d2d1e9397cd.aspx)。
ASP.NET AJAX框架的身份认证服务能够与ASP.NET 2.0的身份认证应用程序服务集成起来,并为其提供客户端的JavaScript调用代理。ASP.NET AJAX客户端部分身份认证代理的相关功能统一由客户端AuthenticationService对象提供。
AuthenticationService对象的完全限定名为Sys.Services.AuthenticationService。这是一个单例(Singleton)模式的对象,无须手工创建实例即可使用。只要页面中包含有ScriptManager控件,我们即可在客户端直接访问到AuthenticationService对象,进而间接地与服务器端身份认证服务打交道并使用ASP.NET 2.0提供的身份认证的相关功能,例如用户登录和注销等——ASP.NET AJAX框架将负责整个异步通讯的实现细节,就像ASP.NET AJAX异步通讯层为Web Service生成客户端代理一样。
AuthenticationService对象提供了两个方法:login()和logout(),分别用来实现用户登录和注销,还暴露出了一系列的常用属性。下面让我们逐一介绍:
5.1.1 login()方法
login()方法用来将用户名和密码传递到服务器端进行验证,并返回是否通过验证的信息,如果需要的话,还会设置相应的客户端Cookie等信息。调用login()方法的完整语法如下:
Sys.Services.AuthenticationService.login(
userName,
password,
isPersistent,
customInfo,
redirectUrl,
loginCompletedCallback,
failedCallback,
userContext
);
其中各个参数的含义如表5-1所示。
表5-1 AuthenticationService对象login()方法的参数
- userName:将要认证的用户的用户名。
- password:将要认证的用户的密码。
- isPersistent:布尔值,表示是否保留持久、跨浏览器会话的认证信息。
- customInfo:保留字段,可能在将来使用。
- redirectUrl:验证成功之后重定向到的URL,若该参数值为null,则不会发生重定向。默认值为null。
- loginCompletedCallback:调用认证服务完成之后的回调函数。注意,不管用户是否通过了服务器端认证,只要认证过程中没有出现诸如超时、异常等问题,都会调用该回调函数。然后,在该回调函数内可以得到用户是否通过了此次验证的信息。
- failedCallback:调用认证服务失败之后的回调函数。导致失败的原因可能是网络连接超时、或是认证服务内部抛出异常等。若是由于用户提供的用户名和密码不正确而不能通过验证,将不会导致调用认证服务失败,该回调函数将不会被调用。
- userContext:随本次异步用户认证调用发送至服务器端的用户上下文对象。
表5-1中所列出的8个参数中,只有userName、password和isPersistent是必须的。至于loginCompletedCallback和failedCallback参数,如果为AuthenticationService对象设置了默认值的话(将在稍后介绍),也可以省略。
调用认证服务完成之后的回调函数,即loginCompletedCallback参数所指定的函数的完整的签名如下(回调函数及其参数的名称可以根据需要自行更改):
function onLoginCompleted(validCredentials, userContext, methodName)
其中,ASP.NET AJAX在执行回调时为我们提供了3个参数:
- validCredentials:一个布尔值,表示用户是否成功通过了验证。
- userContext:在调用login()方法时传递的用户上下文对象。
- methodName:调用方法的方法名。
调用认证服务失败之后的回调函数,即failedCallback参数所指定的函数的完整的签名如下(回调函数及其参数的名称可以根据需要自行更改):
function onAuthenticationFailed(error, userContext, methodName)
ASP.NET AJAX在执行回调时同样为我们提供了3个参数:
- error:导致认证服务失败的异常对象。
- userContext:在调用login()方法时传递的用户上下文对象。
- methodName:调用方法的方法名。
5.1.2 logout()方法
logout()方法用来注销当前已经登录的用户。调用logout()方法的完整语法如下:
Sys.Services.AuthenticationService.logout(
redirectUrl,
logoutCompletedCallback,
failedCallback,
userContext
);
其中各个参数的含义如表5-2所示。
表5-2 AuthenticationService对象logout()方法的参数
- redirectUrl:注销成功之后重定向到的URL,若该参数值为null,则将自动重定向至当前页面。默认值为null。
- logoutCompletedCallback:注销用户完成之后的回调函数。
- failedCallback:注销用户失败之后的回调函数。导致失败的原因可能是网络连接超时、或是认证服务内部抛出异常等。
- userContext:随本次异步用户认证调用发送至服务器端的用户上下文对象。
表5-2中所列出的4个参数均是可选的。对于logoutCompletedCallback和failedCallback参数,如果为AuthenticationService对象设置了默认值的话(将在稍后介绍),也可以省略。
注销成功之后的回调函数,即logoutCompletedCallback参数所指定的函数的完整的签名如下(回调函数及其参数的名称可以根据需要自行更改):
function onLogoutCompleted(validCredentials, userContext, methodName)
其中,ASP.NET AJAX在执行回调时为我们提供了3个参数:
- result:目前并没有使用到该参数,始终为null。
- userContext:在调用logout()方法时传递的用户上下文对象。
- methodName:调用方法的方法名。
注销用户失败之后的回调函数,即failedCallback参数所指定的函数的完整的签名如下(回调函数及其参数的名称可以根据需要自行更改):
function onAuthenticationFailed(error, userContext, methodName)
ASP.NET AJAX在执行回调时同样为我们提供了3个参数:
- error:导致认证服务失败的异常对象。
- userContext:在调用login()方法时传递的用户上下文对象。
- methodName:调用方法的方法名。
5.1.3 常用属性
除了前面介绍的login()和logout()方法,AuthenticationService对象还提供了几个经常用到的属性,如表5-3所示。
表5-3 AuthenticationService对象的常用属性
- isLoggedIn:获取一个布尔值的属性,表示当前用户是否已经登录。
- timeout:获取或设定认证请求的超时时间,单位为毫秒。
- defaultLoginCompletedCallback:获取或设定默认的调用认证服务完成之后的回调函数。
- defaultLogoutCompletedCallback:获取或设定默认的注销用户完成之后的回调函数。
- defaultFailedCallback:获取或设定默认的登录/注销失败之后的回调函数。
如下代码演示了设置AuthenticationService对象的timeout属性:
Sys.Services.AuthenticationService.set_timeout(3000);
若是预先设定了defaultLoginCompletedCallback、defaultLogoutCompletedCallback和defaultFailedCallback属性,那么在调用AuthenticationService对象的login()和logout()方法时,即可免去指定各个回调函数的工作。例如,如下代码就设定了AuthenticationService的这3个属性,并定义了相应的默认回调函数:
Sys.Services.AuthenticationService.set_defaultLoginCompletedCallback(onLoginCompleted);
Sys.Services.AuthenticationService.set_defaultLogoutCompletedCallback(onLogoutCompleted);
Sys.Services.AuthenticationService.set_defaultFailedCallback(onAuthenticationFailed);
function onLoginCompleted(validCredentials, userContext, methodName) {
// ...
}
function onLogoutCompleted(result, userContext, methodName) {
// ...
}
function onAuthenticationFailed(error, userContext, methodName) {
// ...
}
随后,我们即可直接使用如下代码进行用户登录/注销了。其中userName表示用户名,password表示密码:
Sys.Services.AuthenticationService.login(userName, password, true);
Sys.Services.AuthenticationService.logout();