Dans ASP.NET MVC, vous pouvez marquer une méthode de contrôleur avec AuthorizeAttribute
, comme ceci:
[Authorize(Roles = "CanDeleteTags")]
public void Delete(string tagName)
{
// ...
}
Cela signifie que, si l'utilisateur actuellement connecté n'est pas dans le "CanDeleteTags" le rôle, la méthode de contrôleur ne sera jamais appelé.
Malheureusement, pour les échecs, AuthorizeAttribute
retours HttpUnauthorizedResult
, ce qui renvoie toujours le code d'état HTTP 401. Cela provoque une redirection vers la page de connexion.
Si l'utilisateur n'est pas connecté, cela fait beaucoup de sens. Toutefois, si l'utilisateur est déjà connecté, mais n'est pas dans le rôle, c'est source de confusion pour les renvoyer à la page de connexion.
Il semble qu' AuthorizeAttribute
débordait d'authentification et d'autorisation.
Cela semble être un peu une surveillance dans ASP.NET MVC, ou ai-je raté quelque chose?
J'ai dû cuire jusqu'à une DemandRoleAttribute
qui sépare les deux. Lorsque l'utilisateur n'est pas authentifié, il renvoie une erreur HTTP 401, de les envoyer à la page de connexion. Lorsque l'utilisateur est connecté, mais n'est pas dans le rôle, il crée un NotAuthorizedResult
à la place. Actuellement, cette redirige vers une page d'erreur.
Certes, je n'ai pas eu à le faire?