web-dev-qa-db-fra.com

User.IsInRole ne fonctionne pas

J'ai l'application ASP.NET MVC 4. J'utilise Simple Membership Provider permettant de cocher la case Mémoriser mes informations sous le formulaire de connexion. Si cette case est cochée, un cookie persitent .ASPXAUTH est créé et expire 100 jours après la date de connexion. Et tout fonctionne bien, en dehors du menu principal de l'application. 

Certaines parties du menu sont uniquement disponibles pour les utilisateurs administrateurs. J'utilise:

@if (User.IsInRole("Administrator")) { @Html.Partial("_MainMenuPartial") }

pour les empêcher d'être rendus pour un utilisateur normal. Cette approche fonctionne bien juste après la connexion au système. Quand je reviens après un moment et que le cookie persistant est utilisé pour m'authentifier, je me connecte, mais

@User.IsInRole("Administrator")

renvoie "False", donc je ne peux pas voir les éléments du menu admin. En même temps

@User.Identity.Name

renvoie le nom de connexion correct et

@User.Identity.IsAuthenticated

renvoie "True", ce qui prouve que le cookie persistant fonctionne correctement. Pourquoi ne puis-je pas accéder aux rôles d'utilisateur même si cet utilisateur est authentifié par le système?

19
Bartosz

Problème d'utilisation des rôles avec MVC5

J'ai trouvé une solution. Dans mon web.config:

<modules>
    <remove name="FormsAuthenticationModule" />
    <remove name="RoleManager" />
</modules>

J'ai ajouté la ligne remove name = "RoleManager" et le nouveau code AspNet.Identity a pris le relais, me permettant d'utiliser User.IsInRole (..)

http://forums.asp.net/t/1952572.aspx?Problem+usus+roles+with+MVC5

17
Pažout

J'ai eu un problème similaire. Dans mon cas, le problème est résolu lorsque je me déconnecte puis me reconnecte. 

15
Cem Mutlu

Avez-vous essayé d'ajouter

[InitializeSimpleMembership]

dans le contrôleur où vous faites le contrôle?

5
xfan

J'ai eu un problème similaire avec IsUserInRole retournant false. En plaçant une montre dessus, j'ai pu surmonter le problème en utilisant la surcharge décrite ci-dessous. Essayez-le, mettez un point de rupture où vous devenez faux et voyez ce qui se passe.

@if (Roles.IsUserInRole(Model.UserName, "Administrator"))

Je suis sûr que vous pourriez aussi utiliser User.Identity.Name comme premier paramètre.

4
MattSull

Vieille question, mais il manque des informations ici. J'ai rencontré le même problème et il y a une chose à garder à l'esprit. Si vous testez l'identité de l'utilisateur (comme User.IsInRole ("admin")) juste après l'authentification ( sans envoyer la réponse au client ), Identity Framework n'a pas encore renseigné ces informations de session (ou du moins, je n'ai pas trouvé le moyen de le faire). Cette information que vous demandez est renseignée à un moment donné après le retour de votre contrôleur. Si vous souhaitez (I.E.) rediriger vers différentes vues après la connexion, en fonction du rôle de l'utilisateur, vous devrez utiliser un filtre d'autorisation personnalisé.

4
Marcos R

J'ai eu un problème similaire, semble que le module d'authentification n'est pas complètement câblé avec SimpleMembershipProvider. Pour résoudre ce problème, vous pouvez utiliser une classe de rôle pour accéder aux informations nécessaires. Par exemple, pour vérifier si vous utilisez le rôle, vous pouvez utiliser les éléments suivants:

Roles.GetRolesForUser("sergey").Contains("Developer")

Et bien d'autres méthodes utiles lorsque vous travaillez avec des rôles de SimpleMembershipProvider:

   Roles.RoleExists("Developer")
   Roles.CreateRole("Developer");
   Roles.AddUserToRole("sergey", "Developer");
3
Sergey

Aucune de ces réponses n'a fonctionné pour moi, mais j'ai trouvé la réponse ici: https://thinkthencode.wordpress.com/2016/24/Azure-ad-us-app-roles-for-authorization/

La clé ajoutait ce qui suit à Startup.Auth.cs:

TokenValidationParameters = new TokenValidationParameters
{
    RoleClaimType = "roles"
}
1
agressen

Sujet assez ancien mais pouvant confirmer en vs 2015 la solution de l'application de formulaires Web:

<modules>
    <remove name="FormsAuthenticationModule" />
    <remove name="RoleManager" /> <!--add this to web config-->
</modules>
1
Radovan

J'avais un problème similaire, mais dans mon cas, le problème était que le délai d'expiration de la session n'était pas synchronisé avec le délai d'expiration de l'authentification. Par conséquent, je n'ai pas été expulsé automatiquement, mais ma session était en cours d'expiration. , Je n’ai pas pu récupérer les options correctes pour l’utilisateur actuel.

Essayez de vérifier si votre session n'a pas expiré même si vous êtes toujours connecté.

1
pollirrata

Si vous utilisez IdentityManager de Brock Allen pour créer des rôles et les attribuer à des utilisateurs, vous devriez lire cet article: https://github.com/IdentityManager/IdentityManager.AspNetIdentity/issues/3

Vous devrez supprimer les commentaires de la ligne suivante: 

this.RoleClaimType = System.Security.Claims.ClaimTypes.Role;

Vous réaliserez maintenant que vos utilisateurs qui occupaient des rôles n’y sont plus, et vous devrez les rajouter. Si vous consultez la table AspNetUserClaims, vous verrez alors claimType of Role et ' http://schemas.Microsoft.com/ws/2008/06/identity/claims/role ' que vous souhaitez utiliser ultérieurement. 

Une fois que vous avez fait cela, User.IsInRole("rolename") se comporte comme prévu. 

J'espère que cela aide quelqu'un, m'a pris un certain temps pour comprendre cela. 

1
VFein

Si vous utilisez la dernière structure d’identité, veuillez vérifier si vous utilisez les options suivantes:

services.AddIdentity<IdentityUser,IdentityRole>()
        .AddEntityFrameworkStores<WebUserContext>()
        .AddDefaultTokenProviders();

Si vous utilisez AddDefaultIdentity, les rôles ne sont pas renseignés.

services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<WebUserContext>()
        .AddDefaultTokenProviders();
1
Ashok B

Collez ce code dans Global.asax

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
        {
            HttpCookie authCookie =
                Context.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie != null)
            {
                FormsAuthenticationTicket authTicket =
                    FormsAuthentication.Decrypt(authCookie.Value);
                string[] roles = authTicket.UserData.Split(new Char[] { ',' });
                GenericPrincipal userPrincipal =
                    new GenericPrincipal(new GenericIdentity(authTicket.Name), roles);
                Context.User = userPrincipal;
            }
        }

        protected class RolesAttribute : AuthorizeAttribute
        {
            public RolesAttribute(params string[] roles)
            {
                Roles = String.Join(",", roles);
            }
        }
0

Je lutte avec le gestionnaire de rôle MVC5 depuis un certain temps maintenant. J'ai vérifié que User.IsInRole peut renvoyer des résultats différents en même temps, apparemment parce que l'objet User est mis en cache et doit être invalidé. Une façon de faire est de vous déconnecter et de vous reconnecter comme l'une des réponses spécifiées ici. Il suffit de jeter ceci dans le contrôleur qui ajoute le nouveau rôle:

        UserManager.AddToRole(User.Identity.GetUserId(), "Administrator");

        var updatedUser = await UserManager.FindByNameAsync(User.Identity.Name);
        var newIdentity = await updatedUser.GenerateUserIdentityAsync(UserManager);
        AuthenticationManager.SignOut();
        AuthenticationManager.SignIn(newIdentity);

Toutefois, si votre application est ouverte dans d’autres fenêtres, toutes ne seront pas mises à jour.

0
JSideris