アプリケーション全体で使用されるクラスを構築するのに非常に苦労しています。この問題は、ここで説明されている問題とまったく同じです: 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") が呼び出されます。