了解 ASP.NET AJAX 验证和配置文件应用程序服务(三)

 

简介

作为 .NET Framework 3.5的一部分,Microsoft 正在发布大规模环境升级。这不但将提供一个新的开发环境,还将提供新的语言集成查询(LINQ,Language-Integrated Query) 和其他语言方面的提升。此外,其他工具集的一些常用特性,如众所周知的ASP.NET AJAX Extensions,也作为 .NET Framework 基础类库的成员被包含进来了。这些扩展提供了丰富的客户端新特性,包括无需刷新整个页面的局部呈现、通过客户端脚本(包括ASP.NET 配置文件 API)访问 Web 服务的能力、以及一个功能广泛的客户端侧API,用于映射 ASP.NET 服务器侧控件集中的大量控件方案。

本白皮书将介绍 Microsoft ASP.NET AJAX Extensions 所提供的 ASP.NET 配置文件和表单验证服务的实现和用法。AJAX Extensions 通过一个 Web 服务代理脚本来显示表单验证(以及配置文件服务),从而使得对后者的支持简单得难以想象。AJAX Extensions 还支持通过 AuthenticationServiceManager 实现的定制验证。

本白皮书基于 Visual Studio 2008的Beta 2 版本以及.NET Framework 3.5。本白皮书还假定读者使用的是Visual Studio 2008 而非 Visual Web Developer Express,并将根据Visual Studio 的用户界面提供演练。某些代码示例可能会使用在Visual Web Developer Express 中不可用的项目模板。

配置文件和验证

Microsoft ASP.NET 配置文件和验证服务是由ASP.NET 表单验证系统提供的,是ASP.NET 的标准组件。ASP.NET AJAX Extensions 通过客户端AJAX 库的Sys.Services 命名空间下一个相对直接的模型,提供通过脚本代理对这些服务的脚本访问。

验证服务使得用户可以提供凭证以便接收一个验证cookie。它还是一道网关服务,允许ASP.NET 提供的定制用户配置文件进入。ASP.NET AJAX 验证服务的使用与标准 ASP.NET Forms 验证是兼容的,因此升级到AJAX 验证服务后,并不会影响到当前使用Forms 验证(如使用 Login 控件)的应用程序。

配置文件服务允许基于验证服务提供的成员身份,自动集成并存储用户数据。存储的数据是用过web.config 文件指定的。数据管理由不同的配置服务提供程序进行。与验证服务一样,AJAX 配置文件服务与 ASP.NET 配置文件服务是兼容的。这样当前集成了ASP.NET 配置文件服务的页面不因包含支持AJAX 支持而受到影响。

将 ASP.NET 验证和配置文件服务本身整合到应用程序不在本白皮书的内容范围。要了解相关信息,请访问http://msdn2.microsoft.com/en-us/library/tw292whz.aspx,参见 MSDN Library 参考文章 Managing Users by Using Membership。ASP.NET 还可用于向默认作为 ASP.NET Membership 验证服务提供程序的SQL Server 自动设置成员身份。要了解更多信息,请访问 http://msdn2.microsoft.com/en-us/library/ms229862(vs.80).aspx,参见文章ASP.NET SQL Server Registration Tool (Aspnet_regsql.exe)

使用the ASP.NET AJAX验证服务

ASP.NET AJAX 验证服务必须在 web.config 文件中启用:


  
  
  1. <system.web.extensions> 
  2.      <scripting>
  3.           <webServices>
  4.                <authenticationService enabled="true" /> 
  5.           </webServices>
  6.      </scripting> 
  7. </system.web.extensions>

验证服务要求启用 ASP.NET 表单验证服务,并在客户端浏览器上启用cookies(脚本无法启用没有 cookie 的会话,因为这些会话需要 URL 参数)。

一旦启用并配置了 AJAX 验证服务,客户端脚本将立即利用Sys.Services.AuthenticationService对象。客户端脚本主要利用的是login 方法和 isLoggedIn 属性。有几个属性提供默认值的登录方法,可以接受大量参数。

Sys.Services.AuthenticationService成员

login方法:

login()方法从请求验证用户凭证开始。此方法是异步的,不会中断执行。

参数:

参数名称含义
userName必需。要验证的用户名。
password可选(默认为 null)。用户的密码
isPersistent可选(默认为 false)。是否应跨回话保存用户的验证cookie。如果设为 false,浏览器关闭或回话过期时用户将被注销。
redirectUrl可选(默认为null)。验证成功后重定向浏览器的目的URL。如果参数为null 或空字符串,则不进行重定向。
customInfo可选(默认为 null)。此参数现在不使用,保留供以后使用。
loginCompletedCallback可选(默认为 null)。成功登录后要调用的函数。此参数指定后将覆写defaultLoginCompleted 属性。
failedCallback可选(默认为 null)。登录失败后要调用的函数。此参数指定后将覆写defaultFailedCallback 属性。
userContext可选(默认为 null)。应传递给回调函数的定制用户上下文数据。

返回值:

该函数不包括返回值。但对此函数的调用完成后,将包含多个动作:

  • 如果redirectUrl参数既不为 null 也不是空字符串,则当前页面将被刷新或更改。
  • 但如果参数为 null 或空字符串,则 loginCompletedCallback参数或 defaultLoginCompletedCallback属性将被调用。
  • 如果对 web 服务的调用失败,则defaultFailedCallback属性的 failedCallback参数将被调用。

logout方法:

logout()方法移除凭证 cookie,并将当前用户从 web 应用程序注销。

参数:

参数名称含义
redirectUrl可选(默认为 null)。验证成功后重定向浏览器的目的URL。如果参数为 null 或空字符串,则不进行重定向。
logoutCompletedCallback可选(默认为 null)。成功注销后要调用的函数。此参数指定后将覆写defaultLogoutCompleted 属性。
failedCallback可选(默认为 null)。登录失败后要调用的函数。此参数指定后将覆写defaultFailedCallback属性。
userContext可选(默认为 null)。应传递给回调函数的定制用户上下文数据。

返回值:

该函数不包括返回值。但对此函数的调用完成后,将包含多个动作:

  • 如果redirectUrl参数既不为 null 也不是空字符串,则当前页面将被刷新或更改。
  • 但如果参数为 null 或空字符串,则 logoutCompletedCallback参数或 defaultLogoutCompletedCallback属性将被调用。
  • 如果对 web 服务的调用失败,则 defaultFailedCallback属性的 failedCallback参数将被调用。

defaultFailedCallback属性(get, set):mx

此属性指定一个函数,在发生与 web 服务的通信失败时应调用该函数。它应接收一个委托(或函数引用)。

此属性指定的函数引用应包含如下签名:

function AuthenticationFailureCallback(error, userContext, methodName);

参数:

参数名称含义
error指定出错信息。
userContext指定当登录或注销函数被调用时提供的用户上下文信息。
methodName调用函数的方法的名称。

defaultLoginCompletedCallback属性(get, set):

此属性指定一个函数,在登录web 服务完成后应调用该函数。它应接收一个委托(或函数引用)。

此属性指定的函数引用应包含如下签名:

function AuthenticationLoginCompletedCallback(validCredentials, userContext, methodName);

参数

参数名称含义
validCredentials指定用户是否提供有效凭证。如果用户成功登录为true,否则为false。
userContext指定当登录函数被调用时提供的用户上下文信息。
methodName调用函数的方法的名称。

defaultLogoutCompletedCallback属性(get, set):

此属性指定一个函数,在注销web 服务完成后应调用该函数。它应接收一个委托(或函数引用)。

此属性指定的函数引用应包含如下签名:

function AuthenticationLogoutCompletedCallback(result, userContext, methodName);

参数:

参数名称含义
result此参数值始终为 null,保留供以后使用。
userContext指定当登录函数被调用时提供的用户上下文信息。
methodName调用函数的方法的名称。

isLoggedIn属性(get):

此属性用于获取用户的当前验证状态。它由ScriptManager 对象在页面请求过程中指定。

如果用户当前为登录状态,此属性将返回true,反之,则返回 false。

path属性(get, set):

此属性通过编码确定验证web服务的位置。它可用于覆写默认的验证提供程序,以及在ScriptManager 控件的AuthenticationService子节点的 Path 属性中声明性地设定的验证提供程序(更多信息请参见下面的“使用定制验证服务提供程序”主题)。

注意,默认验证服务的位置不会更改。但 ASP.NET AJAX 允许您指定 web 服务的位置,提供与ASP.NET AJAX 验证服务代理相同的类界面。

还要注意,为此属性设置的值不能将脚本请求指向当前站点之外。因为当前应用程序不会接收验证凭证,这一操作将是无用的。而且AJAX 不应发布跨站点的请求,且可以在客户端浏览器中生成一个安全异常。。

此属性是一个表示指向验证web 服务的路径的 String 对象。

timeout属性(get, set):

此属性指定在决定登录请求失败之前等待验证服务执行的时间长度。如果等待调用完成的时间超时,将调用请求失败的回调,且调用不会完成。

此属性是一个 Number 对象,表示等待验证服务结果的毫秒数。

代码示例:登录到验证服务

下列标记呈现了一个示例ASP.NET 页面,含有一个对AuthenticationService类的登录和注销方法的简单脚本调用。


  
  
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" 
  2.     Inherits="_Default" %>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
  4.   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6.      <head runat="server">
  7.           <title>Login Example</title>
  8.           <script type="text/javascript">
  9.                function Login()
  10.                {
  11.                     var userTextbox = $get("txtUser");
  12.                     var passTextbox = $get("txtPassword");
  13.                     Sys.Services.AuthenticationService.login(userTextbox.value, 
  14.                          passTextbox.value, falsenullnull, LoginServiceCompleted, 
  15.                          LoginServiceFailed, "Context Info");
  16.                }
  17.  
  18.                function Logout()
  19.                {
  20.                     Sys.Services.AuthenticationService.logout(null
  21.                        LogoutServiceCompleted, LoginServiceFailed, "Context Info");
  22.                }
  23.  
  24.                function LoginServiceFailed(error, userContext, methodName)
  25.                {
  26.                     alert('There was an error with
  27.                            the authentication service:\n\n' + error);
  28.                }
  29.  
  30.                function LoginServiceCompleted(validCredentials, userContext, methodName)
  31.                {
  32.                     if (validCredentials)
  33.                     {
  34.                          alert('Great! You successfully logged in.');
  35.                     }
  36.                     else
  37.                     {
  38.                          alert('Oops! You gave us bad credentials!');
  39.                     }
  40.                }
  41.  
  42.                function LogoutServiceCompleted(result, userContext, methodName)
  43.                {
  44.                     alert('You have been logged out from the web site.');
  45.                }
  46.           </script>
  47.      </head>
  48.      <body>
  49.           <form id="form1" runat="server">
  50.                <asp:ScriptManager ID="ScriptManager1" runat="server" 
  51.                     EnableScriptLocalization="true">
  52.                </asp:ScriptManager>
  53.                <div>
  54.                     <asp:TextBox ID="txtUser" runat="Server"></asp:TextBox>
  55.                     <br />
  56.                     <asp:TextBox ID="txtPassword" runat="Server" TextMode="Password"/>
  57.                     <br />
  58.                     <asp:Button Text="Log in" ID="btnLogin" runat="server" 
  59.                          OnClientClick="Login(); return false;" />
  60.                </div>
  61.           </form>
  62.      </body>
  63. </html>

通过 AJAX 访问 ASP.NET 配置文件数据

ASP.NET配置文件服务也是通过 ASP.NET AJAX Extensions显示的。ASP.NET 配置文件服务提供了一个丰富精确的API,用于存储和检索用户数据,这是一个相当出色的生产力工具。

配置文件服务不是默认开启的,必须在 web.config 文件中启用。操作方法为:确保web.config 中 profileService 子元素启用为 true,并设置了哪些属性可读或可写,如下所示:


  
  
  1. <system.web.extensions>
  2.      <scripting>
  3.           <webServices>
  4.                <profileService enabled="true"
  5.                     readAccessProperties=”Name,Address,BackgroundColor”
  6.                     writeAccessProperties=”BackgroundColor”/>
  7.           </webServices>
  8.      </scripting>
  9. </system.web.extensions>

也必须对配置文件服务进行配置。尽管配置文件服务的配置不在本白皮书的内容范围,但还是有必要提及,配置文件配置设置中定义的组将作为组名称的子属性成为可访问的。例如,指定如下配置文件部分:


  
  
  1. <profile enabled="true">
  2.      <properties>
  3.           <add name="Name" type="System.String"/>
  4.           <group name="Address">
  5.                <add name="Line1" type="System.String"/>
  6.                <add name="Line2" type="System.String"/>
  7.                <add name="City" type="System.String"/>
  8.                <add name="State" type="System.String"/>
  9.                <add name="Zip" type="System.String"/>
  10.           </group>
  11.           <add name="BackgroundColor" type="System.Drawing.Color"/>
  12.      </properties>
  13. </profile>

客户端脚本将能够访问ProfileService类的属性字段的属性Name、Address.Line1、Address.Line2、Address.City、Address.State、Address.Zip 和 BackgroundColor。

一旦配置了 AJAX 配置文件服务,在页面中马上就是显示可用。但在使用前必须先载入。

Sys.Services.ProfileService成员

properties字段:

properties字段将所有已配置的配置文件数据显示为可通过“dot-操作符-名称”约定引用的子数据。属性组的子属性被视作GroupName.PropertyName。在上面展示的配置文件配置示例中,您可以使用下列标识符来获取用户状态:

Sys.Services.ProfileService.properties.Address.State

load方法:

从服务器载入一个选定列表或所有属性。

参数:

参数名称

含义

propertyNames

可选(默认为 null)。要从服务器载入的属性。

loadCompletedCallback

可选(默认为 null)。载入完成后要调用的函数。

failedCallback

可选(默认为 null)。出错时要调用的函数。

userContext

可选(默认为 null)。要传递给回调函数的上下文信息。

载入函数没有返回值。如果调用成功结束,它将调用loadCompletedCallback参数或 defaultLoadCompletedCallback属性。如果调用失败或超时,将调用failedCallback 参数或 defaultFailedCallback 属性。

如果未提供 propertyNames参数,将从服务器检索所有通过读取配置的属性。

save方法:

save()方法将指定的属性列表(或属性)保存到用户的 ASP.NET 配置文件中。

参数:

参数名称

含义

propertyNames

可选(默认为 null)。要保存到服务器的属性。

saveCompletedCallback

可选(默认为 null)。保存完成后要调用的函数。

failedCallback

可选(默认为 null)。出错时要调用的函数。

userContext

可选(默认为 null)。要传递给回调函数的上下文信息。

保存函数没有返回值。如果调用成功结束,它将调用 saveCompletedCallback参数或 defaultSaveCompletedCallback属性。如果调用失败或超时,将调用failedCallbackdefaultFailedCallback 属性。

如果 propertyNames 参数为 null,将向服务器发送所有的配置文件属性,服务器将决定哪些属性可以保存,哪些不能保存。

defaultFailedCallback属性(get, set):

此属性指定一个函数,在发生与 web 服务的通信失败时应调用该函数。它应接收一个委托(或函数引用)。

此属性指定的函数引用应包含如下签名:

function AuthenticationFailureCallback(error, userContext, methodName);

参数:

参数名称

含义

Error

指定出错信息。

userContext

指定当载入或保存函数被调用时提供的用户上下文信息。

methodName

调用函数的方法的名称。

defaultSaveCompleted属性(get, set)::

此属性指定一个函数,在保存用户配置文件数据完成后应调用该函数。它应接收一个委托(或函数引用)。

此属性指定的函数引用应包含如下签名:

function ProfileSaveComplete(numPropsSaved, userContext, methodName);

参数:

参数名称

含义

numPropsSaved

指定保存的属性数量。

userContext

指定当载入或保存函数被调用时提供的用户上下文信息。

methodName

调用函数的方法的名称。

defaultLoadCompleted属性(get, set):

此属性指定一个函数,在载入用户配置文件数据完成后应调用该函数。它应接收一个委托(或函数引用)。

此属性指定的函数引用应包含如下签名:

function ProfileLoadComplete(numPropsLoaded, userContext, methodName);

参数:

参数名称

含义

numPropsLoaded

指定载入的属性数量。

userContext

指定当载入或保存函数被调用时提供的用户上下文信息。

methodName

调用函数的方法的名称。

path属性(get, set):

此属性通过编码确定配置文件web服务的位置。它可用来覆写默认的配置文件服务提供程序,以及在ScriptManager 控件的ProfileService子节点的Path 属性中声明性地设定的配置文件服务提供程序。

注意,默认配置文件服务的位置不会更改。但 ASP.NET AJAX 允许您指定 web 服务的位置,提供与ASP.NET AJAX 验证服务代理相同的类界面。

还要注意,为此属性设置的值不能将脚本请求指向当前站点之外。AJAX 的底层技术不应发布跨站点的请求,且可以在客户端浏览器中生成一个安全异常。

此属性是一个 String对象,表示指向配置文件web服务的路径。

timeout属性(get, set):

此属性指定在决定载入或保存请求失败之前等待配置文件服务执行的时间长度。如果等待调用完成的时间超时,将调用请求失败的回调,且调用不会完成。

此属性是一个Number对象,表示等待配置文件服务结果的毫秒数。

代码示例:载入页面时载入配置文件数据

下列代码将检查某个用户是否经过验证。如果是,将载入用户首选的背景颜色使用于页面。


  
  
  1. function Page_Load()
  2. {
  3.      if (Sys.Services.AuthenticationService.get_isLoggedIn())
  4.      {
  5.           Sys.Services.ProfileService.load();
  6.      }
  7. }
  8.  
  9. function ProfileLoaded(numPropsLoaded, userContext, methodName)
  10. {
  11.      document.documentElement.style.backgroundColor = 
  12.      Sys.Services.ProfileService.properties.BackgroundColor;
  13. }

使用定制的验证服务提供程序

ASP.NET AJAX Extensions 允许您通过一个定制 web 服务来提供功能,从而创建一个定制的脚本验证服务提供程序。您的web 服务应提供 LoginLogout 这两个方法以便可用。这两个方法必须使用相同的方法签名指定为默认的ASP.NET AJAX 验证 web 服务。

一旦创建了定制 web 服务,就需要指定其路径。指定方法有两种,一是在页面上声明性地指定,二是通过编写代码或客户端脚本指定。

以声明性方式设置路径:

以声明性方式设置路径的方法是:将 ScriptManager 对象的AuthenticationService子类含到您的 ASP.NET 页面中:


  
  
  1. <asp:ScriptManager ID="ScriptManager1" runat="server">
  2.      <AuthenticationService Path="~/AuthService.asmx" />
  3. </asp:ScriptManager>

以编写代码方式设置路径:

以编写代码方式设置路径的方法是:通过您的脚本管理器实例指定路径:


  
  
  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3.      this.ScriptManager1.AuthenticationService.Path = "~/AuthService.asmx";
  4. }

用脚本设置路径:

用脚本设置路径的方法是:使用AuthenticationService类的 path属性设置:


  
  
  1. function Login()
  2. {
  3.      var userTextbox = $get("txtUser");
  4.      var passTextbox = $get("txtPassword");
  5.      Sys.Services.AuthenticationService.set_path("./AuthService.asmx");
  6.      Sys.Services.AuthenticationService.login(userTextbox.value, passTextbox.value, 
  7.      falsenullnull, LoginServiceCompleted, LoginServiceFailed, "Context Info");
  8. }

定制验证的示例 Web服务


  
  
  1. <%@ WebService Language="C#" Class="AuthService" %>
  2.  
  3. using System;
  4. using System.Web;
  5. using System.Web.Services;
  6. using System.Web.Services.Protocols;
  7. using System.Web.Script.Services;
  8.  
  9. [ScriptService]
  10. [WebService]
  11. public class AuthService : WebService
  12. {
  13.  
  14.      [WebMethod]
  15.      public bool Login(string userName, string password, bool createCookie)
  16.      {
  17.           Session["LoggedInUser"] = userName;
  18.           return true;
  19.      }
  20.  
  21.      [WebMethod]
  22.      public void Logout()
  23.      {
  24.           Session.Abandon();
  25.      }
  26. }

小结

ASP.NET服务,具体来说,就是配置文件、成员身份和验证服务,都可轻易向客户端浏览器上的JavaScript 显示。这样开发者就可以将其客户端侧代码无缝集成到验证机制中,而无需使用UpdatePanel 来执行繁重的任务。通过使用web 配置设置,也可以保护配置数据不被客户端访问。默认情况下,任何数据都是不可用的,开发者必须以“选择参与”的方式来配置属性。

此外,通过用同等的方法签名来创建简化的 web 服务实现,开发者可以为这些内部的ASP.NET 服务创建定制的脚本提供程序。对上述技术的支持简化了丰富客户端应用程序的开发,同时也为开发者提供了更大程度的灵活性来满足特定需求。

快乐编程!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值