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...|
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>
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.
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();