Pourquoi [Authorize (Roles = "Admin")] ne fonctionne-t-il pas dans MVC 5 RTM avec ASP.NET identité?
[Authorize(Roles = "Admin")]
travailler hors de la boîte en MVC 5 RTM ASP.NET Identité<!--5?
j'ai pas eu de chance. Notez que [Authorize]
et [Authorize(Users = "AdminUser")]
fonctionne très bien, et les tables AspNetUserRoles et AspNetRoles sont remplies comme je m'y attendais, établissant une relation entre l'utilisateur administrateur et le rôle Administrateur. Cette question semble spécifique aux rôles.
3 réponses
l'utilisateur peut avoir besoin d'être ré-authentifié pour recevoir de nouvelles demandes qui incluent l'adhésion dans le rôle D'administrateur. Puisque MVC 5 utilise ASP.NET Identity out of the box, and by default in MVC 5, ASP.NET Identity stores prétend que des rôles similaires dans les cookies de l'utilisateur, que l'information peut devenir périmée (par conséquent, la base de données dit une chose, mais les cookies de l'utilisateur disent autre chose). La réauthentification d'un utilisateur permettra de rafraîchir leurs revendications, y compris les revendications de rôle de l'utilisateur, pour correspondre à l'état actuel de la la base de données.
Par exemple:
si un utilisateur s'inscrit avant d'être affecté au rôle D'administrateur dans la base de données, cet utilisateur se verra accorder des réclamations, mais celles-ci n'incluront pas son affectation au rôle D'administrateur. Si plus tard, ils sont ajoutés au rôle d'Administrateur, les revendications stockées dans leurs cookies ne sont pas automatiquement mis à jour. Au lieu de cela, seule la base de données a été mise à jour, l'application doit les ré-authentifier avant que leurs anciennes revendications seront remplacées par les nouvelles revendications qui comprennent l'adhésion au rôle d'Administrateur. L'utilisateur manuellement signe et en arrière, est la façon la plus évidente se ré-authentifier l'utilisateur.
Voici un article sur utilisation des revendications dans ASP.NET identité
Et la réponse est la le DbContext de UserManager doit avoir un chargement paresseux activé pour que les rôles de l'utilisateur se manifestent dans l'application de la manière habituelle, attendue. Il s'avère que tout mon code n'était pas "sorti de la boîte"."J'avais très légèrement personnalisé mon DbContext. Avec un peu de chance dans le futur Microsoft va éviter ce bug d'intégration en s'assurant que la collection est chargée avec quelque chose comme userDbContext.Users.Include(o => o.Roles).SingleOrDefault(...)
.
- DO:
ApplicationDbContext.Configuration.LazyLoadingEnabled = true;
- NE PAS:
ApplicationDbContext.Configuration.LazyLoadingEnabled = false;
Notez que si ApplicationDbContext.Configuration.LazyLoadingEnabled
n'est pas défini dans votre code puis par défaut à true
. Donc si c'est aussi bon que le paramètre true
.
etc.
Voici mon deviner ce qui se passe lorsque le chargement paresseux est désactivé, le Roles
propriété du IdentityUser
/ApplicationUser
l'objet est nul ou vide lorsque L'UserManager ou L'UserStore y accède parce que cette collection n'a pas été chargée manuellement. Le code continue alors comme si aucun rôle n'avait été attribué à l'utilisateur, alors qu'en fait, cette collection n'a tout simplement jamais chargé.
Ah, l'arôme de l'échec silencieux. Le code n'a fait du bruit que quand les choses ne semblaient pas bien.
<system.webServer>
<modules>
<remove name="RoleManager" />
</modules>
</system.webServer>