65.9K
CodeProject 正在变化。 阅读更多。
Home

Web 部件中的匿名个性化技巧

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.24/5 (19投票s)

2005年11月13日

3分钟阅读

viewsIcon

140091

ASP.NET 2.0 中我最喜欢的功能是 Web Parts。但 ASP.NET 中的匿名用户无法保存个性化数据,也无法使用 Web Parts 的设计选项。本文将介绍一种巧妙的方法来解决这个问题。

引言

ASP.NET 2.0 提供了一个 Web Parts 框架,允许开发人员轻松地在他们的 Web 门户中集成拖放式菜单等功能。这个框架易于使用,并且所有客户端的设计设置都可以通过 ASP.NET 数据提供程序轻松存储。开发人员无需处理 Web Parts 设计设置的保存或加载过程。本文将不介绍如何使用 Web Parts,您可以在网络上找到大量关于 Web Parts 的文章。

ASP.NET 2.0 Web Parts 框架可以与 Membership 框架以及 Forms 或 Windows 身份验证模式配合使用。问题在于,如果您不想使用任何身份验证模式,就无法使用 Web Parts。能够使用 Web Parts 更改网站设计的客户端用户必须经过身份验证。如果用户未经验证,ASP.NET Web Parts 框架就无法通过数据提供程序保存用户的设计设置,因此也无法允许切换设计模式。

想法

如果我们仅仅需要所有访问我们网站的用户都经过身份验证,我们就需要将所有用户注册到我们网站的身份验证系统中。我们将使用 Forms Authentication 并提供一些巧妙的方法。用户将以一种隐藏的方式通过 Cookie 注册到我们的网站。我们将通过 Cookie 来识别我们的访客,并自动对他们进行身份验证,以便为他们提供 Web Parts 的设计选项。

使用隐藏身份验证

首先,我们将为我们的网站设置 Forms Authentication。您只需按如下方式修改您的 Web.Config 文件:

        <!--
            The <authentication> section enables configuration 
            of the security authentication mode used by 
            ASP.NET to identify an incoming user. 
        -->
        <authentication mode="Forms" />

我们将为每个访客提供一个 Cookie 来识别用户的身份,以便向他们显示他们的设计设置。我们需要为每个访客提供一个身份名称。我们将创建一个随机的 GUID 作为身份。

Dim MyCookieName As String = "Reminder"
Dim MyCookie As System.Web.HttpCookie = Request.Cookies(MyCookieName)
Dim UserID As String
UserID = System.Guid.NewGuid.ToString.Replace("-", "")
MyCookie = New System.Web.HttpCookie(MyCookieName, UserID)
MyCookie.Expires = DateTime.Now.AddYears(10)
Response.Cookies.Add(MyCookie)

我们的 Cookie 名称是“Reminder”。您可以在您的项目中更改名称。我们的 Cookie 数据是使用 .NET Framework 的“System.Guid.NewGuid”类生成的随机 GUID 名称“UserID”。现在,每次访问我们的 Web 门户时,我们都可以通过编程方式识别我们的访客。

我们现在应该使用用户的 GUID 名称“UserID”来向我们的 Forms Authentication 系统进行身份验证。在正常情况下,ASP.NET 会使用 Cookie 来存储 Forms Authentication 数据。我们将手动模拟这个过程。

Dim authTicket As FormsAuthenticationTicket = _
    New FormsAuthenticationTicket(1, UserID, DateTime.Now, _
    DateTime.Now.AddSeconds(30), False, "roles")
Dim encryptedTicket As String = FormsAuthentication.Encrypt(authTicket)
authCookie = New HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
Response.Cookies.Add(authCookie)

现在,我们的用户已通过 Forms Authentication 登录到我们的网站,并可以访问 Web Parts 的设计属性。

我们会有很多访问者为自己设计我们的网站,然后可能再也不会访问我们的网站,或者删除他们的 Cookie,丢失他们的身份和设计设置。那么,如果自去年以来他们就没有访问过我们的网站,我们为什么要存储所有访问者的设计设置呢?通过下面的代码,我们可以手动连接到 ASP.NET Membership 数据存储,并通过检查用户的最后活动日期来手动删除用户的设置和配置文件。

Dim LastDate As Date = Date.Now.AddYears(-1)

Dim cnn As System.Data.SqlClient.SqlConnection = New _
  System.Data.SqlClient.SqlConnection(_
  ConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString)
Dim cmd As System.Data.SqlClient.SqlCommand

cmd = New System.Data.SqlClient.SqlCommand("DELETE FROM" & _ 
      " aspnet_PersonalizationPerUser where UserID IN " & _ 
      "(SELECT UserID from aspnet_Users where " & _ 
      "[LastActivityDate] < @Date)", cnn)
cmd.Parameters.Add("@Date", Data.SqlDbType.DateTime)
cmd.Parameters.Item("@Date").Value = LastDate
Try
    cnn.Open()
    cmd.ExecuteNonQuery()
Catch ex As Exception
Finally
    cnn.Close()
End Try

cmd = New System.Data.SqlClient.SqlCommand("DELETE FROM" & _ 
      " aspnet_Users where [LastActivityDate] < @Date", cnn)
cmd.Parameters.Add("@Date", Data.SqlDbType.DateTime)
cmd.Parameters.Item("@Date").Value = LastDate
Try
    cnn.Open()
    cmd.ExecuteNonQuery()
Catch ex As Exception
Finally
    cnn.Close()
    cmd.Dispose()
    cnn.Dispose()
End Try

完整的解决方案如下:

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

If Page.IsPostBack = False Then
    Dim authCookie As HttpCookie = _
        Request.Cookies(FormsAuthentication.FormsCookieName)
    If authCookie Is Nothing Then
        Dim MyCookieName As String = "Reminder"
        Dim MyCookie As System.Web.HttpCookie = _
                     Request.Cookies(MyCookieName)
        Dim UserID As String
        If MyCookie Is Nothing Then
            UserID = System.Guid.NewGuid.ToString.Replace("-", "")
            MyCookie = New System.Web.HttpCookie(MyCookieName, UserID)
            MyCookie.Expires = DateTime.Now.AddYears(10)
            Response.Cookies.Add(MyCookie)
        Else
            UserID = MyCookie.Value
        End If
        Dim authTicket As FormsAuthenticationTicket = New _
          FormsAuthenticationTicket(1, UserID, DateTime.Now, _
          DateTime.Now.AddSeconds(30), False, "roles")
        Dim encryptedTicket As String = _
            FormsAuthentication.Encrypt(authTicket)
        authCookie = New HttpCookie(FormsAuthentication.FormsCookieName, _
                                                        encryptedTicket)
        Response.Cookies.Add(authCookie)
        Response.Redirect(Request.Url.ToString)
    End If
    
    Dim LastDate As Date = Date.Now.AddYears(-1)
    
    Dim cnn As System.Data.SqlClient.SqlConnection = New _
      System.Data.SqlClient.SqlConnection(_
      ConfigurationManager.ConnectionStrings(_
      "LocalSqlServer").ConnectionString)
    Dim cmd As System.Data.SqlClient.SqlCommand
 
    cmd = New System.Data.SqlClient.SqlCommand("DELETE FROM" & _ 
          " aspnet_PersonalizationPerUser where UserID IN " & _ 
          "(SELECT UserID from aspnet_Users where " & _ 
          "[LastActivityDate] < @Date)", cnn)
    cmd.Parameters.Add("@Date", Data.SqlDbType.DateTime)
    cmd.Parameters.Item("@Date").Value = LastDate
    Try
        cnn.Open()
        cmd.ExecuteNonQuery()
    Catch ex As Exception
        Response.Write(ex.Message)
    Finally
        cnn.Close()
    End Try
    
    cmd = New System.Data.SqlClient.SqlCommand("DELETE FROM" & _ 
          " aspnet_Users where [LastActivityDate] < @Date", cnn)
    cmd.Parameters.Add("@Date", Data.SqlDbType.DateTime)
    cmd.Parameters.Item("@Date").Value = LastDate
    Try
        cnn.Open()
        cmd.ExecuteNonQuery()
    Catch ex As Exception
        Response.Write(ex.Message)
    Finally
        cnn.Close()
        cmd.Dispose()
        cnn.Dispose()
    End Try
End If

End Sub

场景从检查 Forms Authentication Cookie 开始。如果我们已经对用户进行了身份验证,则无需执行任何操作。如果没有 Forms Authentication Cookie,我们将进一步检查是否获得了我们的身份 Cookie。如果存在名为“Reminder”的身份 Cookie,我们可以加载用户的身份并使用 Forms Authentication 进行身份验证。这样,所有用户以前的设计设置都会自动加载到我们的 Web 门户。如果用户没有我们的“Reminder” Cookie,我们将创建一个身份并为其存储,然后使用新身份向身份验证系统进行身份验证。

完成所有这些过程后,我们将检查旧用户,并删除那些在 Web 门户上至少一年没有活动的(用户)。

结论

您只需在您使用 Web Parts 设计属性的 Web 窗体的“Page_Load”事件中使用此系统。在您未来的门户开发中,尽情使用这种巧妙的方法吧。

Web Parts 中匿名个性化技巧 - CodeProject - 代码之家
© . All rights reserved.