从根本上来说Authentication Service是通过Ajax调用WebService,在WebService里通过使用Membership的验证方式来验证用户,验证用户通过以后调用FormAuthentication.SetAuthCookie方法使用户处于验证通过状态。这一段可以通过读源代码来了解。
在服务端就是WebService时我们也可以操作Cookie。AJAX请求(XMLHttpRequest )其实就是普通的请求,服务器端无法识别客户端请求方式。AJAX请求也拥有普通请求的特点。在服务器端使用普通的方式操作Cookie即可。
在读源代码的时候,觉得有两个类需要注意以下
- VirtualPathUtility类,这个类实现了对虚拟路径的一些操作方法,如一个虚拟路径转化为绝对路径等等。
- BuildManager类,微软内部使用的类,基本上没有相关的文档,从字面意义上理解是管理编译以后的程序集,里面有一些反射方法。
通过观察Authentication Service的实现方式,扩展Authentication Service有两个方向
1、扩展Membership。扩展Membership需要实现27个成员,但是Authentication Service使用的仅仅需要扩展ValidateUser方法,即我们可以在ValidateUser方法里面访问我们自己的数据库,来验证用户,通过验证返回true,否则返回false。然后在webConfig里配置下列节点
<membership defaultProvider="SampleProvider">
<providers>
<add name="SampleProvider"
type="SampleMembershipProvider" />
</providers>
</membership>
通过此节点告诉应用程序,现在使用的Membership是SamlpeMembershipProvider类。
但这种方式仍然是通过Cookie在标识用户通过验证,因为在Authentication Service里还是使用FormAuthenticaton.SetAuthCookie来设置用户通过验证标识。
2、扩展Authentication Service类。扩展这个类,我们可以完全摆脱Membership的束缚,并且还可以完全更换保存用户通过验证标识的方式(可以使用Session等等)。扩展这个类实现的方法比扩展Membership实现的方法少的多。在扩展的WebService里,我们只需要实现Login和Logout两个方法
public bool Login(string userName, string password, bool createPersistentCookie) {
}
public void Logout() {
}
注意扩展这两个方法时参数列表一定要完全相同,包括参数名。
实现了这两个方法之后,在ScirptManager里面加上Authentication Service的路径
<asp:ScriptManager runat="server" ID="ScriptManager1">
<AuthenticationService Path=“…" />
</asp:ScriptManager>
那么我们在客户端调用Login和Logout方法就是调用我们实现的Authentication Service。这种方式,我们可以使用Session等方式来保存用户通过验证标识,摆脱了FormAuthentication使用的方式,也摆脱了Membership框架的限制,可以使用我们自己的用户管理框架。