2009-09-02 76 views
1

我有一個基於winforms(VB 2008)的應用程序,我正在開發,我想使用自定義角色進行用戶訪問。添加自定義角色 - VB 2008 Winforms

應用程序佈局: 我有一個主窗體,當某些操作發生時打開登錄窗體。登錄表單實習生使用我創建的認證類來認證用戶並設置訪問權限。在我的應用程序設置頁面上,我將身份驗證模式設置爲應用程序定義,因爲我無法在將部署此應用程序的環境中使用Windows身份驗證。

該應用程序使用MS SQL 2005 db,我在身份驗證過程中使用的3個表是User_Account,User_Roles和User_Access表。 User_Account中的帳戶與User_Roles表中的角色的組合是User_Access表的基礎。使用User_Access表是我如何應用

認證方法中,指派訪問各種功能: 認證用戶,我使用了「My.User.CurrentPrincipal」(下)方法的代碼。 My.User對象效果很好,並且允許在引用當前經過身份驗證的用戶時在整個應用程序中使用「My.User.Name」屬性。

訪問方法: 爲了設置我用我的驗證類中的功能和My.User.Name傳遞一個變量的當前用戶訪問級別。該函數使用For循環內的數據集表適配器和Select Case語句爲用戶分配所有訪問級別(以下功能代碼)。

我的問題: 用戶分配訪問權限,此方法的工作,但它在整個應用程序作爲My.User對象是不持久的。我想找到一種方法來使用它的.IsInRole屬性通過My.User對象創建自定義角色。我想用我的User_Roles表動態創建這些角色。 這將允許在我的應用程序中使用My.User.IsInRole(「MyRole」)語法來使用自定義角色...類似於我目前能夠使用My.User.Name的方式。不幸的是,我目前可以驗證的唯一角色是內置的Windows類型帳戶(管理員...等)。

我發現了許多與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 

回答

0

我認爲你需要實現它訪問你的SQL表自定義IPrincipal對象。嘗試this頁面。

編輯:

首先,看一看的IIdentityIPrincipal的定義。你會注意到IIdentity沒有定義「角色」屬性。他們選擇在他們的IIdentity(SampleIIdentity)的實現上實現一個名爲Role的額外屬性,然後他們使用它來實現IPrincipal。我建議你實現你自己的Role屬性(它查詢你現有的表),並返回你自己定義的一個(或一個數組)你所定義的角色類型。然後在你的IPrincipal實現中,你可以編寫IsInRole來查詢新的Role屬性。希望這更有意義,我的回答很簡單。

+0

也許這只是我(極有可能),但是當我通過鏈接指向的Microsoft示例時,我仍然只能訪問內置的系統角色(管理員,訪客等)。 我可以設置一個自定義用戶並通過My.User.Name屬性訪問它,但似乎無法弄清楚如何爲用戶創建和分配自定義角色(除基於Windows系統的角色之外)並將它們與My一起使用。 User.IsInRole(「MyCustomRole」)屬性。 你會碰巧有任何建議可能會導致我後來的事情。 謝謝! – 2009-09-14 18:20:09

+0

我沒有從這裏獲得所有東西,我正在從記憶中工作(這不是以前的樣子),但是我根據我記得的內容更新了我的答案。 – ssg31415926 2009-09-15 14:12:29

+0

非常感謝您的更新回覆。 我正在開發的這個項目是我第一次使用這種類型的身份驗證,因此需要一段時間才能完全沉入(我可能會有點粗壯)。讓我咀嚼新的信息一段時間,我應該能夠弄清楚你提供的附加信息。 再次感謝!我很感激你花時間來幫忙。 – 2009-09-16 14:59:45