0

アプリケーション全体で使用されるクラスを構築するのに非常に苦労しています。この問題は、ここで説明されている問題とまったく同じです: Sitecore が別のユーザーとユーザー セッションを切り替える

セッション変数は、最初のユーザーの後にログインするセカンダリ ユーザーによって共有されています。My Class は基本的にセッション オブジェクトにアクセス許可レベルを割り当て、各ページやコントロールが DB にアクセスせずにそれを読み取ることができるようにします。

クラス構造は次のとおりです。

Public NotInheritable Class cPermissions
    Public Shared Sub AssignPermissionToSession(ByVal UserID As Integer)
    Private Shared Sub SetInSession(key As String, value As Dictionary(Of String, String))
    Public Shared Function HasPerm(ByVal ControlName As String) as Boolean
End Class

プロセスを説明すると、ユーザーがログインします。ログイン コードは、cPermissions.AssignPermissionToSession(UserID) を呼び出します。その Sub は SetInSession を呼び出し、セッション オブジェクトにパーミッション ディクショナリを割り当てます。

補足として、クラスをインスタンス化せずに共有関数 HasPerm を使用して、コードを簡略化できるため、このインスタンスでは NotInheritable クラスを使用することをお勧めします。HasPerm は、セッション オブジェクトを読み取り、コントロールに権限があるかどうかにかかわらず、true または false を返します。

元の問題に戻ると、最初に述べた前のリンクによると、Sub が共有されているため、セッション ハイジャックが発生しています。しかし、SetInSession サブを共有しないと、共有サブ AssignPermissionsToSession (ログインが必要) はそれにアクセスできません。

したがって、基本的に、偶発的なセッション ハイジャックを経験することなく、このクラスを正しく構造化する方法を誰かが教えてくれれば、本当にありがたいです。前もって感謝します!

要求されたコードは次のとおりです (簡潔にするために縮小しています)。

Public NotInheritable Class cPermissions
    'local dictionary that gets created, and then assigned to session
    Private Shared dPermissions As New Dictionary(Of String, String)

    Public Shared Sub AssignPermissionToSession(ByVal UserID As Integer)
        dPermissions.Clear() 
        'Here I open DB and get a list of Roles that each member may have
        While ....
            BuildPermissionArray()
        End While

        'Now dPermission should be created assign to session
        SetInSession("Permissions", dPermissions)
    End Sub

    Private Shared Sub BuildPermissionArray()
         'Here we create the local Dictionary ready for the session
         'So for each role we get each permission for each control ie:
         dPermissions.add(control,perm)
    End Sub

    Private Shared Sub SetInSession(ByVal key As String, value As Dictionary(Of String, String))
        If value Is Nothing Then
            HttpContext.Current.Session(key) = New Dictionary(Of String, Integer)
        Else
            HttpContext.Current.Session(key) = value
        End If
    End Sub

    Public Shared Function HasPermission(ByVal PermissionType As Permission, ByVal ControlName As String) As Boolean
        Dim obj As Object = HttpContext.Current.Session("Permissions")
        Dim d As Dictionary(Of String, String) = DirectCast(obj, Dictionary(Of String, String))
        'Here I search the dictionary and check relevant permission for the control name
        Return result
    End Function
End Class                     

ログインコードは cPermissions.AssignPermissionToSession(UserID) を呼び出します。

また、ページの読み込みごとに現在のページのコントロールが読み取られ、cPermissions.HasPermission(View,"PageOrControlName") が呼び出されます。

4

0 に答える 0