Question

J'ai WinForms (VB 2008) app base que je développe et je veux utiliser des rôles personnalisés pour l'accès utilisateur.

Mise en page d'application: J'ai une forme principale qui ouvre un formulaire de connexion lorsque certaines actions se produisent. Le stagiaire formulaire de connexion utilise une classe d'authentification que j'ai créé, pour authentifier les utilisateurs et les droits d'accès définis. Sur ma page Paramètres des applications, je Mode d'authentification ensemble à l'application définie parce que je ne peux pas utiliser l'authentification Windows dans l'environnement où cela sera déployé.

L'application utilise un db et les 3 tables MS SQL 2005 j'utilise dans le processus d'authentification sont les USER_ACCOUNT, User_Roles et tables User_Access. La combinaison d'un compte dans le USER_ACCOUNT et les rôles au sein de la table User_Roles sont les bases de la table User_Access. Utilisation de la table User_Access comment j'autoriser l'accès aux différentes fonctions de l'application

Méthode d'authentification: Pour authentifier un utilisateur, j'utilise la méthode « My.User.CurrentPrincipal » (Code ci-dessous). L'objet My.User fonctionne très bien et permet l'utilisation de la propriété « My.User.Name » dans toute l'application en se référant à l'utilisateur authentifié.

Méthode d'accès: Pour définir les niveaux d'accès actuels des utilisateurs que je utilise une fonction au sein de ma classe d'authentification et en passant My.User.Name comme variable. La fonction utilise un Dataset Tableau adaptateur et une instruction Select Case dans une boucle For pour affecter tous les niveaux d'accès pour l'utilisateur (code de fonction ci-dessous).

Mon problème: Cette méthode d'attribution des droits d'accès à un utilisateur ne fonctionne pas mais ce n'est pas persistant dans l'application comme l'objet My.User est. Je voudrais trouver un moyen de créer des rôles personnalisés à travers l'objet My.User en utilisant sa propriété .IsInRole. Je voudrais avoir ces rôles dynamiquement créés à l'aide de ma table de User_Roles. Cela permettrait aux rôles personnalisés à utiliser tout au long de mon application à l'aide du My.User.IsInRole ( « MyRole ») syntaxe ... similaire à la façon dont je suis actuellement utiliser My.User.Name. Malheureusement, les seuls rôles que je peux actuellement contre sont les valider dans les comptes intégrés de type Windows (Adminisrator ... ect.).

Je l'ai trouvé beaucoup d'informations et d'exemples liés à ASP.Net, ainsi que la mise en place Winforms l'authentification Windows, mais rien à ce jour directement lié à ma question. Je pense qu'il ya un moyen d'y arriver ... mais je ne l'ai pas été capable de le trouver. Toute aide serait grandement apprécié !!

Merci pour votre aide!


Exemple d'authentification de l'utilisateur:

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

Affectation d'accès, exemple:

 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
Était-ce utile?

La solution

Je pense que vous avez besoin de mettre en œuvre un objet IPrincipal personnalisé qui accède à votre table SQL. Essayez cette page .

Edit:

D'abord, un coup d'oeil sur les définitions de IIdentity et IPrincipal . Vous remarquerez que IIdentity ne dispose pas d'une propriété « rôle » défini. Ils ont choisi de mettre en œuvre une propriété supplémentaire appelé rôle sur la mise en œuvre de IIdentity (SampleIIdentity), puis ils l'ont utilisé de leur mise en œuvre de IPrincipal. Ce que je suggère est que vous implémentez votre propre propriété de rôle (qui interroge votre table existante) et retourne un (ou un tableau) d'un type de rôle que vous vous définissez. Ensuite, dans votre mise en œuvre de IPrincipal, vous pouvez coder IsInRole pour interroger la nouvelle propriété de rôle. Il faut espérer que plus de sens que ma réponse plutôt étriquée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top