web-dev-qa-db-fra.com

Les rôles d'utilisateur de vérification d'identité ASP.NET ne fonctionnent pas

J'ai une application ASP.NET MVC 5. J'utilise le fournisseur d'identité ASP.NET standard pour la gestion des utilisateurs et des rôles. Il est important que j'utilise IdentityUser à partir d'un propre projet de référentiel, mais cela semble correct. Je peux enregistrer, me connecter, modifier des utilisateurs et gérer leurs rôles.

J'ajoute l'utilisateur au rôle avec ces lignes:

UserManager.AddToRole(userdetail.Id, r);
db.Entry(userdetail).State = EntityState.Modified;
db.SaveChanges();

Cela semble fonctionner au niveau DB.

Mais, je ne peux pas utiliser les authentifications basées sur les rôles, en fait les simples

HttpContext.User.IsInRole("Administrator")

ne fonctionne pas trop.

[Authorize(Roles="Administrator")]

ne fonctionne pas trop.

Je ne peux vérifier qu'avec cette méthode, si l'utilisateur est un administrateur:

UserManager.IsInRole(userID, "Administrator").

Pourquoi?

Dans chaque tutoriel que j'ai trouvé, tout fonctionne bien. Le référentiel des différents projets pourrait être la raison? Ou l'identité ASP.NET est tellement cassée?

Veuillez conseiller,

21
martonx

Il semble y avoir un problème. [Le problème par conception]

  • Les noms de rôle sont sensibles à la casse dans AuthorizeAttribute et User.IsInRole
  • Les noms de rôle ne respectent pas la casse dans UserManager.IsInRole

De plus, vérifiez que le nom de rôle correct est utilisé pour la vérification.

[Ce qui précède est basé sur le test effectué avec le code ci-dessous. Nom du rôle = "Admin", l'utilisateur est ajouté au rôle "Admin".]

[Authorize(Roles="Admin")] /*True as "Admin" has A capital as entered in Role name*/
public ActionResult Secured()
{
    if (User.IsInRole("admin")) /*This is False*/
    {
         Console.WriteLine("In");
    }
    if(UserManager.IsInRole(User.Identity.GetUserId(), "admin")) /*This is True!!*/
    {
         Console.WriteLine("In");
    }
    return View();
}

Si nous changeons l'attribut en [Authorize(Roles="admin")], il redirige vers la page de connexion.

19
jd4u

Dans ce cas, vous devez vous déconnecter et vous reconnecter.

Parce que les données de rôles sont également stockées dans des cookies, vous devez donc émettre à nouveau le cookie pour le faire fonctionner.

25
Maulik Anand

Avez-vous cette entrée dans votre web.config?

    <roleManager enabled="true">
        <providers>
            <clear />
            <add connectionStringName="ApplicationServices" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" applicationName="/" />
        </providers>
    </roleManager>

De plus, si je me souviens bien, il existe un espace de noms différent pour l'assembly du fournisseur de rôles dans différentes versions de .NET.

1
Fred Chateau