none
Liste des rôles RRS feed

  • Question

  • Bonjour tout le monde,

    Ainsi donc, avec Membership.GetAlUsers(), j'ai pu obtenir une liste des utilisateurs, si seulement je n'avais pas oublié le DataBind ...

    Maintenant, j'attaque la liste des rôles.

    J'ai pu créer le rôle admin en ajoutant une ligne dans la table dbo.aspnet_roles, je pourrais faire pareil avec le rôle vendeuse, mais l'occasion est bonne pour progresser sur la page d'administration (qui n'est accessible qu'à l'administrateur, ce qui confirme que le rôle est fonctionnel).

    Ah, mais là, c'est un peu plus corsé.

    Déjà pour commencer il faut que les rôles soient activés, alors je tape :

    Roles.Enabled = true

    et là je me fais insulter :

    System.InvalidOperationException : 'Cette méthode ne peut être appelée que lors de la phase d'initialisation de pré-démarrage de l'application. Utilisez PreApplicationStartMethodAttribute pour déclarer une méthode qui sera invoquée lors de cette phase.'

    C'est quoi ce truc, si je suis sur la page et pas la voisine, c'est bien que mon rôle fonctionne ?

    Alors, développer une classe d'attribut, et ensuite se mettre en quête de savoir quoi faire avec.

    Mais ... C'est quelque chose de fondamental, ça, non ? Comment ça se fait que je découvre ça au détour d'une exception lors de l'exécution ?


    • Modifié Gloops samedi 5 mars 2022 20:33
    mercredi 15 septembre 2021 09:58

Réponses

  • Quelques points d'achoppement auxquels prendre garde pour gérer les rôles en ligne.

    • pour utiliser les rôles il faut les activer dans le web.config, comme mentionné ci-dessus ; il convient aussi de déclarer les fournisseurs (Providers) adéquats
    • l'accès direct à la base doit se faire avec parcimonie, car on dispose d'un nombre limité de connexions. Une connexion pour chaque contrôle lié aux données a vite fait de faire beaucoup.
    • il sera donc préférable de créer des contrôles indépendants, et de leur fournir les données dans le Page_Load, à l'aide des objets dédiés comme Roles. Attention que ce faisant, dans le cas des listes on met à -1 leur propriété SelectedIndex, ce qui risque d'être gênant dans le cas d'un PostBack. Il conviendra donc de prendre soin de la persistance des sélections. Tant que EnableViewState aussi bien du contrôle que de la page sont à true, et ViewStateMode est à Enabled, le contrôle retrouve sa valeur au début du Page_Load. Donc, si on initialise une liste dans le Page_Load, il faut prendre garde, au moins dans le cas du IsPostBack, de sauvegarder sa valeur avant, pour la restaurer après.
    protected void Page_Load(object sender, EventArgs e)
    {
      int sel = lbxRoles.SelectedIndex;
      lbxRoles.DataBind();
      lbxRoles.SelectedIndex = sel;
    }






    • Marqué comme réponse Gloops samedi 5 mars 2022 20:30
    • Modifié Gloops samedi 5 mars 2022 20:57
    samedi 5 mars 2022 20:23
  • Bonjour,

    Apparemment, c'est le message de l'exception qui est trompeur, il y a lieu de déclarer un fournisseur de rôles dans le web.config

    Seulement ça ne passe quand même pas du premier coup.

    J'ai une erreur "base verrouillée"

    System.Data.SqlClient.SqlException : 'Cannot open database "D:\PROJECTS VISUAL STUDIO\WEB\FROUFROU\FROUFROU\APP_DATA\ASPNETDB.MDF" requested by the login. The login failed.
    Login failed for user 'admin'.'

    sur

                lbxRoles.DataSource = Roles.GetAllRoles();

    alors que juste au-dessus lbxUsers a très bien pu recevoir la liste des utilisateurs par

    this.lbxUsers.DataSource = Membership.GetAllUsers();

    J'ai exclu la base de l'explorateur de projets, SSMS est fermé, il n'y a pas d'onglet ouvert sur une requête. Dans l'explorateur de serveurs j'ai ouvert une connexion pour bien m'assurer de la refermer.

    Voilà la déclaration du fournisseur. C'est curieux de l'appeler SqlProvider, mais c'est fourni comme ça dans la doc, je n'ai changé que le nom de la chaîne de connexion et le nom de l'application :

        <roleManager defaultProvider="SqlProvider"
          enabled="true"
          cacheRolesInCookie="true"
          cookieName=".ASPROLES"
          cookieTimeout="30"
          cookiePath="/"
          cookieRequireSSL="true"
          cookieSlidingExpiration="true"
          cookieProtection="All" >
    
          <providers>
            <clear />
            <add
              name="SqlProvider"
              type="System.Web.Security.SqlRoleProvider"
              connectionStringName="ConnectionString"
              applicationName="/" />
            </providers>
    
        </roleManager>

    Plus haut dans le web.config il y a :

      <connectionStrings>
        <add name="ConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;Integrated Security=True;Connect Timeout=30"
          providerName="System.Data.SqlClient" />
      </connectionStrings>


    à quoi le fournisseur de rôles fait appel.

    C'est vrai que ConnectionString pour la base d'authentification ce n'est pas forcément très heureux comme nom, mais à ce stade il n'y a pas d'autre base appelée.



    • Modifié Gloops jeudi 16 septembre 2021 08:44
    • Marqué comme réponse Gloops samedi 5 mars 2022 20:29
    jeudi 16 septembre 2021 08:23

Toutes les réponses

  • Bonjour,

    J'espère que la documentation suivante vous aidera:
    Roles Classe
    Roles.Enabled Propriété
    Roles.GetAllRoles Méthode
    Roles.GetUsersInRole(String) Méthode

    Cordialement,
    Nina

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 16 septembre 2021 07:22
    Modérateur
  • Bonjour,

    Apparemment, c'est le message de l'exception qui est trompeur, il y a lieu de déclarer un fournisseur de rôles dans le web.config

    Seulement ça ne passe quand même pas du premier coup.

    J'ai une erreur "base verrouillée"

    System.Data.SqlClient.SqlException : 'Cannot open database "D:\PROJECTS VISUAL STUDIO\WEB\FROUFROU\FROUFROU\APP_DATA\ASPNETDB.MDF" requested by the login. The login failed.
    Login failed for user 'admin'.'

    sur

                lbxRoles.DataSource = Roles.GetAllRoles();

    alors que juste au-dessus lbxUsers a très bien pu recevoir la liste des utilisateurs par

    this.lbxUsers.DataSource = Membership.GetAllUsers();

    J'ai exclu la base de l'explorateur de projets, SSMS est fermé, il n'y a pas d'onglet ouvert sur une requête. Dans l'explorateur de serveurs j'ai ouvert une connexion pour bien m'assurer de la refermer.

    Voilà la déclaration du fournisseur. C'est curieux de l'appeler SqlProvider, mais c'est fourni comme ça dans la doc, je n'ai changé que le nom de la chaîne de connexion et le nom de l'application :

        <roleManager defaultProvider="SqlProvider"
          enabled="true"
          cacheRolesInCookie="true"
          cookieName=".ASPROLES"
          cookieTimeout="30"
          cookiePath="/"
          cookieRequireSSL="true"
          cookieSlidingExpiration="true"
          cookieProtection="All" >
    
          <providers>
            <clear />
            <add
              name="SqlProvider"
              type="System.Web.Security.SqlRoleProvider"
              connectionStringName="ConnectionString"
              applicationName="/" />
            </providers>
    
        </roleManager>

    Plus haut dans le web.config il y a :

      <connectionStrings>
        <add name="ConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;Integrated Security=True;Connect Timeout=30"
          providerName="System.Data.SqlClient" />
      </connectionStrings>


    à quoi le fournisseur de rôles fait appel.

    C'est vrai que ConnectionString pour la base d'authentification ce n'est pas forcément très heureux comme nom, mais à ce stade il n'y a pas d'autre base appelée.



    • Modifié Gloops jeudi 16 septembre 2021 08:44
    • Marqué comme réponse Gloops samedi 5 mars 2022 20:29
    jeudi 16 septembre 2021 08:23
  • Bonjour,

    Est-ce que des fois j'aurais posé une colle ?

    La base est dans le répertoire Data du projet, sur ma machine, donc si quelqu'un y accède, c'est moi. Mais il reste à savoir par quel processus.

    Ça n'a pas été si compliqué pour Membership, et maintenant pour les rôles je vais rester le bec dans l'eau ?

    Qu'est-ce qu'il pourrait bien y avoir comme accès à cette base d'authentification ?

    J'ai fermé SSMS, l'explorateur de serveurs, j'ai "exclu du projet" la base, elle n'apparaît plus dans l'explorateur de solutions ...

    Sur la page d'administration j'ai la liste des membres par Membership.GetAllUsers(), mais "Roles.Enabled = true;" provoque un conflit, impossible de se connecter à la base et du coup d'afficher la page.

    Quelqu'un voit autre chose ?

    Est-ce que Membership et Roles ne partagent pas la même connexion ?

    Ah finalement Roles.Enabled est déjà true, alors voyons voir l'instruction suivante :

    >? Roles.GetAllRoles().Count().ToString()
    'Roles.GetAllRoles().Count().ToString()' a levé une exception de type 'System.Data.SqlClient.SqlException'
        Class: 11
        ClientConnectionId: {5ee38b60-77d6-45e8-b770-d92bd8d93694}
        Data: {System.Collections.ListDictionaryInternal}
        ErrorCode: -2146232060
        Errors: {System.Data.SqlClient.SqlErrorCollection}
        HResult: -2146232060
        HelpLink: null
        InnerException: null
        LineNumber: 65536
        Message: "Cannot open database \"D:\\PROJECTS VISUAL STUDIO\\WEB\\FROUFROU\\FROUFROU\\APP_DATA\\ASPNETDB.MDF\" requested by the login. The login failed.\r\nLogin failed for user 'UC00007\\admin'."
        Number: 4060
        Procedure: ""
        Server: "(LocalDB)\\MSSQLLocalDB"
        Source: ".Net SqlClient Data Provider"
        StackTrace: null
        State: 1
        TargetSite: null

    Ah, quelque chose d'intéressant dans la fenêtre d'erreurs :

    Message IDE0052 Vous pouvez supprimer le membre privé 'frmAdmin.roleProvider',

    car la valeur qui lui est affectée n'est jamais lue Froufrou D:\Projects Visual Studio\Web\Froufrou\Froufrou\0\frmAdmin.aspx.cs 13 IntelliSense Actif


    Bon, mais on peut faire comme si je ne l'avais pas déclaré, car le résultat est semble-t-il le même.


    • Modifié Gloops jeudi 23 septembre 2021 17:05
    jeudi 23 septembre 2021 15:53
  • Quelques points d'achoppement auxquels prendre garde pour gérer les rôles en ligne.

    • pour utiliser les rôles il faut les activer dans le web.config, comme mentionné ci-dessus ; il convient aussi de déclarer les fournisseurs (Providers) adéquats
    • l'accès direct à la base doit se faire avec parcimonie, car on dispose d'un nombre limité de connexions. Une connexion pour chaque contrôle lié aux données a vite fait de faire beaucoup.
    • il sera donc préférable de créer des contrôles indépendants, et de leur fournir les données dans le Page_Load, à l'aide des objets dédiés comme Roles. Attention que ce faisant, dans le cas des listes on met à -1 leur propriété SelectedIndex, ce qui risque d'être gênant dans le cas d'un PostBack. Il conviendra donc de prendre soin de la persistance des sélections. Tant que EnableViewState aussi bien du contrôle que de la page sont à true, et ViewStateMode est à Enabled, le contrôle retrouve sa valeur au début du Page_Load. Donc, si on initialise une liste dans le Page_Load, il faut prendre garde, au moins dans le cas du IsPostBack, de sauvegarder sa valeur avant, pour la restaurer après.
    protected void Page_Load(object sender, EventArgs e)
    {
      int sel = lbxRoles.SelectedIndex;
      lbxRoles.DataBind();
      lbxRoles.SelectedIndex = sel;
    }






    • Marqué comme réponse Gloops samedi 5 mars 2022 20:30
    • Modifié Gloops samedi 5 mars 2022 20:57
    samedi 5 mars 2022 20:23