none
isUserInrole de l'utilisateur courant (membership utilisé pour winform) RRS feed

  • Question

  • Bonjour,

    J'utilise le membership de asp.net pour mon application winform  en VB.NET .

    en faite en utilisant getRolesforUser pour détecter le role de l'utilisant courant en winform ca retourne plusieurs valeurs puisque un utilisateur peut avoir plus qu'1 role.

    ce que je veux faire est désactiver un controle par exemple suivant le role que je détecte mais s'il retourne plusieur valeurs donc  c pas posssible.

    j'ai eu une idée de créer une table qui contient le role et un champ bit pour désigner si j'autorise ou non le controle dans la form i par exemple

    comment je peux procéder?

     

     If Roles.IsUserInRole("Administrators") Then
         f1.Show()
        Else
         Label1.Visible = True
        End If
    

     


    ce bout de code verifie si le role est administrator mais ce que je veux faire est détecter le role (au cas ou j'ai crée un role en dynamique ,un role commercant par exemple je dois lui attribuer des autorisations)

    Merci 

     


    Best Regards Please mark as answer if my post is helpful
    vendredi 10 juin 2011 10:34

Réponses

  • Bonjour cipri 

    c'est exactement ca .en faite mon probleme est que le user peut avoir plusieur roles.si un role lautorise alors lautre le bloque .

    en faite la fonction dont vous avez parlé est intéressante je vais voir comment faire.

    en faite pour précipiter les choses j'ai utilisé ce code en forcant la saisie d'un seul role :) c pas trop top mais j'avais plus le choix 

     nom = Thread.CurrentPrincipal.Identity.Name
        Dim user As MembershipUser = Membership.GetUser(nom)
        Dim identity As New GenericIdentity(user.UserName)
        Dim principal As New RolePrincipal(identity)
        Threading.Thread.CurrentPrincipal = principal
        tag = e.Node.Text
        If Roles.GetRolesForUser(nom).Length = 1 Then
          rolesArray = Roles.GetRolesForUser(nom)
          role = rolesArray.First.ToString
          com_sql.Connection = con
          com_sql.CommandType = CommandType.Text
          com_sql.CommandText = "select autorise from Autorisation where role='" & role & "' and tag='" & tag & "'"
          con.Open()
          Dim adapter2 As New SqlDataAdapter(com_sql)
          Dim SearchResultsTable2 As New DataTable()
          adapter2.Fill(SearchResultsTable2)
          If TypeOf e.Node Is RoleNode Then
    
            'cancel event if not in role
            e.Cancel = CBool(SearchResultsTable2.Rows(0).Item(0))
          End If
        End If
    


    en faite je désactive un neoud dans un treeview par role

    et le champ autorise et de type booléen dans une table autorisation que j'ai crée

    si vous avez une autre idée plus optimale je serais partante.

     

    Cordialement


    Best Regards Please mark as answer if my post is helpful
    mercredi 15 juin 2011 09:54
  • Bonjour,

    Pour la fonction dont je parle je ferais quelque chose comme ça :

    Private Function ShowControl(control As System.Windows.Forms.Control, listeRoles() As String) As Boolean

     

            Dim afficher As Boolean = False

     

            For Each role As String In listeRoles

     

                If CanShow(control, role) Then

     

                    afficher = True

     

                End If

     

            Next

     

            Return afficher

     

    End Function

    La function CanShow(control, role) determinera dans la base des données si le contrôle s’affiche ou pas pour le rôle role. Bien sûr qu’il est possible à éviter faire plusieurs interrogations de la base des données, mais comme je ne sais pas comment vous gères les données  dans votre application, j’ai préfère cet exemple.

    Puis, une autre idée est d’assigner à chaque rôle une valeur numérique qui indique l’importance du rôle pour votre application. Pour un utilisateur avec plusieurs rôles la configuration de contrôles sera déterminée par le plus important rôle de l’utilisateur. Comme dans l’autre exemple il faut déterminer tous les rôles de l’utilisateur et puis vous pouvez déterminer le plus important à l’aide d’une fonction.

    Cordialement,

    Cipri

     


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 16 juin 2011 06:50

Toutes les réponses

  • Bonjour,

    Je pense que cette question rejoint l'autre ...
    j'essaie de comprendre, vous faites une application ASP avec des module WinForm ?

    Je ne crois pas que le code ASP fonctionne de la meme facon pour un WinForm

    J'ai jamais fait d'ASP encore :) mais si vous voulez récupérer juste l'utilisateur courant

    My.User.Name
    


    Quand vous parlez de role je vois pas trop de quoi il s'agit que voulez vous dire ?

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    samedi 11 juin 2011 08:16
    Auteur de réponse
  • Bonjour xavier

    pour vous expliquer en faite j'ai développé avant une application asp.net donc du web et j'ai utilisé le membership (la base généré automatiquement)qui contient une gestion complète de role et de user.

    maintenant je veux utiliser ce membership dans un autre projet winform en vb.net donc ce n'est plus du web

    j'ai utilisé ce lien 

    http://msmvps.com/blogs/theproblemsolver/archive/2006/01/15/81140.aspx

    on peut configurer notre application pour utiliser ce membership et donc je ne parles pas de l'utilisateur courant de la machine mais de l'utilisateur courant relatif au provider membership 

    Concernant les roles par exemple j'ai le role administrateur,manager,commercial etc qui sont géré aussi avec ce membership

    je c pas si c plus clair?


    Best Regards Please mark as answer if my post is helpful
    samedi 11 juin 2011 08:25
  • Bonjour,

    J’espère que j’ai bien compris ce que vous voulez faire. Donc vous pouvez utiliser la fonctionne Roles.GetRolesForUser pour obtenir tous les rôles de l’utilisateur. Puis vous pouvez définir comme vous avez dit une table qui vous dit si un certain rôle permet à un utilisateur voir le control. Finalement, pour décider si l’utilisateur le verra ou pas, il faut créer une fonctionne qui déterminera s’il y a ou pas un rôle de l’utilisateur qui lui permet de voir le control. Donc si, par exemple, on a un rôle « commerçant » qui ne lui permet pas le voir, mais on a aussi le rôle « administrateur » qui lui permet voir le control, on va afficher le control.

    Si je n’ai pas bien compris votre question svp expliquez-nous ce que vous voulez faire avec plus de détails.

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mercredi 15 juin 2011 09:22
  • Bonjour cipri 

    c'est exactement ca .en faite mon probleme est que le user peut avoir plusieur roles.si un role lautorise alors lautre le bloque .

    en faite la fonction dont vous avez parlé est intéressante je vais voir comment faire.

    en faite pour précipiter les choses j'ai utilisé ce code en forcant la saisie d'un seul role :) c pas trop top mais j'avais plus le choix 

     nom = Thread.CurrentPrincipal.Identity.Name
        Dim user As MembershipUser = Membership.GetUser(nom)
        Dim identity As New GenericIdentity(user.UserName)
        Dim principal As New RolePrincipal(identity)
        Threading.Thread.CurrentPrincipal = principal
        tag = e.Node.Text
        If Roles.GetRolesForUser(nom).Length = 1 Then
          rolesArray = Roles.GetRolesForUser(nom)
          role = rolesArray.First.ToString
          com_sql.Connection = con
          com_sql.CommandType = CommandType.Text
          com_sql.CommandText = "select autorise from Autorisation where role='" & role & "' and tag='" & tag & "'"
          con.Open()
          Dim adapter2 As New SqlDataAdapter(com_sql)
          Dim SearchResultsTable2 As New DataTable()
          adapter2.Fill(SearchResultsTable2)
          If TypeOf e.Node Is RoleNode Then
    
            'cancel event if not in role
            e.Cancel = CBool(SearchResultsTable2.Rows(0).Item(0))
          End If
        End If
    


    en faite je désactive un neoud dans un treeview par role

    et le champ autorise et de type booléen dans une table autorisation que j'ai crée

    si vous avez une autre idée plus optimale je serais partante.

     

    Cordialement


    Best Regards Please mark as answer if my post is helpful
    mercredi 15 juin 2011 09:54
  • Bonjour,

    Pour la fonction dont je parle je ferais quelque chose comme ça :

    Private Function ShowControl(control As System.Windows.Forms.Control, listeRoles() As String) As Boolean

     

            Dim afficher As Boolean = False

     

            For Each role As String In listeRoles

     

                If CanShow(control, role) Then

     

                    afficher = True

     

                End If

     

            Next

     

            Return afficher

     

    End Function

    La function CanShow(control, role) determinera dans la base des données si le contrôle s’affiche ou pas pour le rôle role. Bien sûr qu’il est possible à éviter faire plusieurs interrogations de la base des données, mais comme je ne sais pas comment vous gères les données  dans votre application, j’ai préfère cet exemple.

    Puis, une autre idée est d’assigner à chaque rôle une valeur numérique qui indique l’importance du rôle pour votre application. Pour un utilisateur avec plusieurs rôles la configuration de contrôles sera déterminée par le plus important rôle de l’utilisateur. Comme dans l’autre exemple il faut déterminer tous les rôles de l’utilisateur et puis vous pouvez déterminer le plus important à l’aide d’une fonction.

    Cordialement,

    Cipri

     


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 16 juin 2011 06:50