如何:通过 WCF 身份验证服务自定义身份验证 Cookie

更新:2007 年 11 月

本主题演示在将 ASP.NET 身份验证服务用作 Windows Communication Foundation (WCF) 服务时,如何自定义其身份验证 Cookie(票证)。当您需要在身份验证期间将用户特定的数据存储在 Cookie 中时,就可以自定义身份验证 Cookie。

Bb398778.alert_note(zh-cn,VS.90).gif说明:

通常,与将数据存储在 Cookie 中相比,将用户特定的数据存储在 ASP.NET 配置文件属性中是更好的选择。配置文件属性数据不会绑定到某台计算机或受 Cookie 生存期的限制。此外,可以在配置文件属性中更安全地存储用户数据。如果您有少量非敏感数据,并且不希望使用 ASP.NET 配置文件功能,则自定义 Cookie 的内容将非常有用。

身份验证服务将在已验证用户凭据之后且在已设置身份验证 Cookie 之前引发 CreatingCookie 事件。通过为 CreatingCookie 创建事件处理程序并自行管理身份验证 Cookie,可以自定义 Cookie。通过传递给事件处理程序的 CreatingCookieEventArgs 对象,可以访问用户名、密码和自定义凭据。

若要使用户从可以发送和使用 SOAP 1.1 消息的客户端应用程序(例如 Java 应用程序)登录,请使用身份验证服务的 WCF 实现。

  1. 在 Web 应用程序的 Global.asax 文件中,为 CreatingCookie 事件创建事件处理程序。

  2. 在该处理程序中,向 Cookie 的 CustomCredential 属性添加信息。

    下面的示例演示如何通过将 CustomCredential 属性的值添加到 UserData 属性来自定义身份验证 Cookie。

    Sub AuthenticationService_CreatingCookie(ByVal sender As Object, _
                     ByVal e As System.Web.ApplicationServices.CreatingCookieEventArgs)
        Dim ticket As FormsAuthenticationTicket = New _
           FormsAuthenticationTicket _
            (1, _
             e.Username, _
             DateTime.Now, _
             DateTime.Now.AddMinutes(30), _
             e.IsPersistent, _
             e.CustomCredential, _
             FormsAuthentication.FormsCookiePath)
    
        Dim encryptedTicket As String = FormsAuthentication.Encrypt(ticket)
    
        Dim cookie As HttpCookie = New _
            HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
        cookie.Expires = DateTime.Now.AddMinutes(30)
    
        HttpContext.Current.Response.Cookies.Add(cookie)
        e.CookieIsSet = True
    End Sub
    
    void AuthenticationService_CreatingCookie(object sender, 
        System.Web.ApplicationServices.CreatingCookieEventArgs e)
    {
        FormsAuthenticationTicket ticket = new
              FormsAuthenticationTicket
                (1,
                 e.UserName,
                 DateTime.Now,
                 DateTime.Now.AddMinutes(30),
                 e.IsPersistent,
                 e.CustomCredential,
                 FormsAuthentication.FormsCookiePath);
    
        string encryptedTicket =
             FormsAuthentication.Encrypt(ticket);
    
        HttpCookie cookie = new HttpCookie
             (FormsAuthentication.FormsCookieName,
              encryptedTicket);
        cookie.Expires = DateTime.Now.AddMinutes(30);
    
        HttpContext.Current.Response.Cookies.Add(cookie);
        e.CookieIsSet = true;
    }
    
  3. 在 Global.asax 文件的 Application_Start 方法中,绑定 CreatingCookie 事件的事件处理程序。

    下面的示例演示如何将一个处理程序绑定到 CreatingCookie 事件。

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        AddHandler System.Web.ApplicationServices.AuthenticationService.CreatingCookie, _
            AddressOf Me.AuthenticationService_CreatingCookie
    End Sub
    
    void Application_Start(object sender, EventArgs e)
    {
        System.Web.ApplicationServices.AuthenticationService.CreatingCookie 
            += new EventHandler<System.Web.ApplicationServices.CreatingCookieEventArgs>
            (AuthenticationService_CreatingCookie);
    }
    
  4. 从可以使用来自 Web 服务的 SOAP 消息的应用程序调用身份验证服务。

编译代码

必须在 Web 服务器上设置身份验证服务才能让前面的示例工作。有关更多信息,请参见如何:启用 WCF 身份验证服务

安全性

如果要传递敏感的用户数据(如身份验证凭据),请始终通过安全套接字层(SSL,通过使用 HTTPS 协议)来访问身份验证服务。有关如何设置 SSL 的信息,请参见 Configuring Secure Sockets Layer (IIS 6.0 Operations Guide)(配置安全套接字层(IIS 6.0 操作指南))。

请参见

概念

Windows Communication Foundation 身份验证服务概述

参考

AuthenticationService

CreatingCookieEventArgs