类中的SQL数据读取器

时间:2011-01-20 15:02:49

标签: asp.net

您好 在我们网站的几个页面上,我想检查当前登录的用户是否已接受我们过去的条款和条件。此布尔值存储在应用程序数据库中。而不是在每个相关页面上重新创建一个sql数据读取器,我想我可以把它放在一个类中,然后将true / false分配给一个变量。这是我到目前为止所做的,它完全符合我的要求:

Public Shared ReadOnly Property termsCompleted As String
    Get
        Dim selectTerms As String = "SELECT Terms FROM tblPersonal WHERE Ref=@Ref"

        Dim dbconn As String = ConfigurationManager.ConnectionStrings("ApplicationServices").ConnectionString
        Using myConnection As New SqlConnection(dbconn)
            myConnection.Open()

            Dim cmdTerms As New SqlCommand(selectTerms, myConnection)
            cmdTerms.Parameters.AddWithValue("@Ref", myUser.ToString())

            Dim readerTerms As SqlDataReader = cmdTerms.ExecuteReader()
            readerTerms.Read()

            termsCompleted = readerTerms.Item(0)

            readerTerms.Close()
            myConnection.Close()

        End Using

    End Get
End Property

我是他们在每个与拒绝访问和重定向相关的页面上使用以下内容(在page_load中):

If Variables.termsCompleted = False Then
        Response.Redirect("Terms.aspx")
    End If

虽然这项工作正常但我对它的安全性感兴趣,并且有更好的方法吗?

由于

5 个答案:

答案 0 :(得分:1)

您是否考虑过在Session_Start期间检索一次信息,并在会话中进行搜索,以便您可以随时查询信息?

如果您无法在身份验证/授权期间检索数据,则可以按照上面显示的相同方式检索数据。

将值放入会话:Session["termsCompleted"] = "true";

从会话中读取值:if (Session["termsCompleted"] == "true")....

作为替代方案,您可以将信息添加到HttpContext.Current.User

答案 1 :(得分:1)

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
    ' Code that runs when a new session is started
    Dim selectTerms As String = "SELECT Terms FROM tblPersonal WHERE Ref=@Ref"

    If Request.IsAuthenticated = True Then
        Dim dbconn As String = ConfigurationManager.ConnectionStrings("ApplicationServices").ConnectionString
        Using myConnection As New SqlConnection(dbconn)
            myConnection.Open()

            Dim cmdTerms As New SqlCommand(selectTerms, myConnection)
            cmdTerms.Parameters.AddWithValue("@Ref", Variables.myUser)

            Dim readerTerms As SqlDataReader = cmdTerms.ExecuteReader()
            readerTerms.Read()

            Session("termsCompleted") = readerTerms.Item(0)

            readerTerms.Close()
            myConnection.Close()

        End Using
    End If
End Sub

在代码隐藏中:

If Session("termsCompleted") = False Then
        Response.Redirect("Terms.aspx")
    End If

不幸的是,无论数据库中有什么内容,每次都会重定向到terms.aspx页面。从调试开始,即使它是真的,它也会将读取器项目设为“False”..

由于

答案 2 :(得分:0)

创建一个基页并让每个页面继承该页面。在此基页中,您可以执行一次数据访问以执行此检查。然后将其存储在会话状态。

答案 3 :(得分:0)

我认为你没有安全问题......我认为这更像是一个最佳实践问题。将数据访问请求放在属性中并不是一种好的做法。在我工作的项目中,我通常会有一个类,它具有处理我的数据访问的功能,其中有一个buisiness层,可以调用我的数据访问。 n层项目设计可能不适合您的项目...我只是根据我的经验说话。

如果需要重用bit标志,只需将其存储在Session中。

答案 4 :(得分:0)

此逻辑并不真正属于某个页面。如果接受使用条款是访问您网站部分的要求,那么您应该以这种方式处理它。此问题与拥有只有少数用户可以访问的站点的管理员部分非常相似。

理想情况下,这是您在请求到达页面之前要处理的内容。有(至少)两种方法来解决这个问题。

  1. 您可以编写订阅module事件的自定义HTTP AuthorizeRequest。它将检查此页面是否要求您接受或不接受协议条款,如果是,则检查用户是否有。如果不是,它会将用户重定向到使用条款页面。

  2. 另一个选项是将此代码放入Global.ascx文件中。您可能希望订阅AuthorizeRequest事件并在那里执行您的逻辑。

  3. 我认为你选择哪个选项并不重要(尽管第二个可能更直接地实施)。好处是这个问题是在页面本身之外处理的。这样,当您向网站添加新页面时,您不会忘记向其添加验证代码。如果您决定除了接受用户需要做其他事情的协议条款外,您现在还有一个地方可以更改,而不是浏览所有页面等。

    您还应该了解其他一些答案,并将此值存储到Session中,以避免每次页面加载时都必须执行数据库请求。

    更多信息: