web-dev-qa-db-fra.com

Impossible pour ASP.NET Core 2.0 de vérifier si l'utilisateur joue correctement le rôle dans la vue Razor ou dans l'annotation du contrôleur [authorize]

Je travaille sur un projet hérité avec une autorisation basée sur les rôles mais j'ai quelques problèmes. User.IsInRole("admin") et [Authorize(Roles = "admin")] toujours en échec de l'autorisation. User.IsInRole() renvoie toujours False. Je suis à peu près sûr que cet utilisateur a été correctement ajouté au rôle. Role name 'admin' is already taken.User already in role 'admin'.

Peut-être que certains services en influencent un autre.

Voici le code de reprise de mon startup.cs:

public void ConfigureServices(IServiceCollection services){

    services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(connetctionString));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomUserClaimsPrincipalFactory>();
    services.AddMvc();
    services.AddDistributedMemoryCache();
    services.AddSession();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env){
    app.UseStaticFiles();
    app.UseAuthentication();
    app.UseMvc(routes => {...});
}

Qu'est-ce que je rate?

PS Oui, je me suis connecté et je me suis connecté.

PS Oui l'utilisateur est dans le rôle admin

PS les "admin" sont corrects en minuscule

PS ApplicationDbContext hérite d'IdentityDbContext

Ps2. Voici mes données

SELECT id,username FROM aspnetusers;

|id          | username        |
|c4f7bf16... | [email protected] |

SELECT Id,Name FROM aspnetroles;

|Id          | Name  |
|50e2a572... | admin |

SELECT * FROM aspnetuserroles;

|UserId      | RoleId     |
|c4f7bf16... | 50e2a572...|
7
Daniel Santos

Après beaucoup d'erreurs, j'ai finalement trouvé ce qui me manquait.

J'étendais seulement UserClaimsPrincipalFactory<ApplicationUser>not UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>.

Après une extension correcte, les rôles ont pu être réclamés.

public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
0
Daniel Santos

J'ai l'impression que c'est parce que votre Roles et votre Claims sont mélangés quelque part.

Selon the docs la méthode ClaimsPrincipal.IsInRole () recherche les revendications de type ClaimsIdentity.RoleClaimType.

Il est possible de définir une revendication de "admin" sans qu'il soit de ClaimType ClaimsIdentity.RoleClaimType, auquel cas l'authentification échouera.

2
ste-fu

le serveur d'identité est configuré pour renvoyer le rôle dans les revendications après l'authentification.Vous pouvez vérifier la revendication dans le contrôleur.

Comme ça

var claims = User.Claims.ToList();
1
Munendra Kumar