1

開発中のwinforms(VB 2008)ベースのアプリがあり、ユーザーアクセスにカスタムロールを使用したいと考えています。

アプリケーションレイアウト: 特定のアクションが発生したときにログインフォームを開くメインフォームがあります。ログインフォームのインターンは、私が作成した認証クラスを使用して、ユーザーを認証し、アクセス権を設定します。[アプリケーションの設定]ページで、[認証モード]を[アプリケーション定義]に設定しています。これは、これが展開される環境でWindows認証を使用できないためです。

アプリケーションはMSSQL2005 dbを使用し、認証プロセスで使用している3つのテーブルは、User_Account、User_Roles、およびUser_Accessテーブルです。User_Account内のアカウントとUser_Rolesテーブル内のロールの組み合わせは、User_Accessテーブルのベースです。User_Accessテーブルの使用は、アプリケーション内のさまざまな機能へのアクセスを割り当てる方法です。

認証方法: ユーザーを認証するために、「My.User.CurrentPrincipal」(以下のコード)方法を使用しています。My.Userオブジェクトはうまく機能し、現在認証されているユーザーを参照するときにアプリ全体で「My.User.Name」プロパティを使用できるようにします。

アクセス方法: 現在のユーザーのアクセスレベルを設定するために、Authenticationクラス内の関数を使用し、変数としてMy.User.Nameを渡します。この関数は、データセットテーブルアダプターとForループ内のSelect Caseステートメントを使用して、ユーザーにすべてのアクセスレベルを割り当てます(以下の関数コード)。

私の問題: ユーザーにアクセス権を割り当てるこの方法は機能しますが、My.Userオブジェクトのように、アプリケーション全体で永続的ではありません。.IsInRoleプロパティを使用してMy.Userオブジェクトを介してカスタムロールを作成する方法を見つけたいと思います。User_Rolesテーブルを使用してこれらのロールを動的に作成したいと思います。これにより、My.User.IsInRole( "MyRole")構文を使用して、アプリケーション全体でカスタムロールを使用できるようになります...現在My.User.Nameを使用できる方法と同様です。残念ながら、現在検証できる役割は、組み込みのWindowsタイプのアカウント(管理者... ect。)のみです。

ASP.Netに関連する多くの情報と例、およびWinforms Windows認証の設定を見つけましたが、これまでのところ、私の問題に直接関連するものはありません。これを達成する方法があると思います...しかし、私はそれを見つけることができませんでした。どんな助けでも大歓迎です!!

ご協力ありがとうございました!


'ユーザー認証の例:

If Authenticate.CheckPassword(tbxUserName.Text, strPassword) Then
            My.User.CurrentPrincipal = New GenericPrincipal(New GenericIdentity(tbxUserName.Text), Nothing)

'アクセス割り当ての例:

 Public Shared Function GetUser(ByVal strUsername As String) As Authenticate
        Using UserAdapter As New dbUserTableAdapters.User_AccountsTableAdapter()
            Dim UserTable As dbUser.User_AccountsDataTable = UserAdapter.GetByUser(strUsername)


            Dim tempUser As New Authenticate() _
                With {.ID = UserTable(0).id, _
                    .Username = UserTable(0).User_Name, _
                    .Password = UserTable(0).id}

            Using AccessAdapter As New dbUserTableAdapters.User_AccessTableAdapter()
                Dim AccessTable As dbUser.User_AccessDataTable = AccessAdapter.GetByUser(tempUser.ID)

                For c As Integer = 0 To AccessTable.Rows.Count - 1

                    Select Case AccessTable(c).Role_Id
                        Case RoleType.SysAdmin
                            tempUser.AllowSysAdmin = True

                        Case RoleType.Maintenance
                            tempUser.AllowMaintenance = True

                        Case RoleType.ReportAll
                            tempUser.AllowRptAll = True

                        Case RoleType.ReportException
                            tempUser.AllowRptExceptions = True

                        Case RoleType.EventManagment
                            tempUser.AllowEventStart = True
                        Case Else

                    End Select

                Next

                Return tempUser

            End Using
        End Using
    End Function
4

1 に答える 1

0

SQL テーブルにアクセスするカスタム IPrincipal オブジェクトを実装する必要があると思います。このページを試してみてください。

編集:

まず、IIdentityIPrincipalの定義を見てください。IIdentity には「Role」プロパティが定義されていないことに注意してください。彼らは、IIdentity (SampleIIdentity) の実装に Role という追加のプロパティを実装することを選択し、IPrincipal の実装からそれを使用しました。私が提案しているのは、独自の Role プロパティ (既存のテーブルを照会する) を実装し、自分で定義した Role タイプの 1 つ (または配列) を返すことです。次に、IPrincipal の実装で、IsInRole をコーディングして、新しい Role プロパティをクエリできます。うまくいけば、それは私のかなり露出度の高い答えよりも理にかなっています。

于 2009-09-03T16:02:07.880 に答える