title: Adding custom roles - VB 2008 Winforms
body: <p>I have a winforms (VB 2008) based app that I'm developing and I want to use custom roles for user access.  </p>
  
  <p><strong>Application Layout:</strong>
  I have a Main form that opens a login form when certain actions occur.  The Login form intern uses an authentication class that I've created, to authenticate users and set access rights.  On my Applications settings page, I have Authentication Mode set to Application-defined because I cannot use Windows Authentication in the environment where this will be deployed.  </p>
  
  <p>The application uses a MS SQL 2005 db and the 3 tables I'm using in the authentication process are the User_Account , User_Roles and User_Access tables.  The combination of an account in the User_Account and the roles within the User_Roles table are the bases for the User_Access table.  Using the User_Access table is how I assign access to the various functions within the application</p>
  
  <p><strong>Authentication Method:</strong> 
  To authenticate a user, I'm using the "My.User.CurrentPrincipal" (Code below) method.  The My.User object works great and allows the use of "My.User.Name" property throughout the app when referring to the currently authenticated user.  </p>
  
  <p><strong>Access Method:</strong>
  In order to set the current users access levels I'm using a function within my Authentication class and passing in My.User.Name as a variable.  The function uses a Dataset Table Adaptor and a Select Case statement inside a For loop to assign all the access levels for the user (Function code below).  </p>
  
  <p><strong>My Problem:</strong>
  This method of assigning access rights to a user does work but it's not persistent throughout the application as the My.User object is.  I would like to find a way to create custom roles through the My.User object using its .IsInRole property.   I would like to have these roles dynamically created using my User_Roles table. 
  This would allow the custom roles to be  used throughout my application using the My.User.IsInRole("MyRole")  syntax ...similar to how I'm currently able to use My.User.Name.    Unfortunately the only roles I can currently validate against are the built in Windows type accounts (Adminisrator ...ect.).  </p>
  
  <p>I have found lots of information and examples related to ASP.Net as well as setting up Winforms Windows authentication but nothing so far directly related to my issue.
  I think there's a way to accomplish this...but I have not been able to find it.  Any help would be greatly appreciated!!</p>
  
  <p>Thank you for your help!</p>
  
  <hr>
  
  <p><strong>'User Authentication example:</strong></p>
  
  <pre><code>If Authenticate.CheckPassword(tbxUserName.Text, strPassword) Then
              My.User.CurrentPrincipal = New GenericPrincipal(New GenericIdentity(tbxUserName.Text), Nothing)
  </code></pre>
  
  <p><strong>'Access assignment example:</strong></p>
  
  <pre><code> 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
  </code></pre>