Autorisation de rôle MVC
Je suis en train de mettre en œuvre un rôle de mécanisme d'autorisation qui vérifie les rôles de la session courante de l'utilisateur, si l'utilisateur est dans le bon rôle, il/elle est autorisé, sinon erreur d'affichage de la vue.
Le problème est que lorsque l'utilisateur tente d'accéder à la méthode ci-dessous dans le contrôleur, il le fait entrer dans la RoleAuthorizationAttribute classe et obtient verfied mais la méthode dans le contrôleur n'est pas exécutée.
Remarque : l'utilisateur a le rôle de Client
Méthode de contrôleur
[RoleAuthorization(Roles = "Client, Adminsitrator")]
public ActionResult addToCart(int ProductID, string Quantity)
{
tempShoppingCart t = new tempShoppingCart();
t.ProductID = ProductID;
t.Username = User.Identity.Name;
t.Quantity = Convert.ToInt16(Quantity);
new OrdersService.OrdersClient().addToCart(t);
ViewData["numberOfItemsInShoppingCart"] = new OrdersService.OrdersClient().getNoOfItemsInShoppingCart(User.Identity.Name);
ViewData["totalPriceInSC"] = new OrdersService.OrdersClient().getTotalPriceOfItemsInSC(User.Identity.Name);
return PartialView("quickShoppingCart", "Orders");
}
Rôle d'Authentification de classe
[System.AttributeUsage(System.AttributeTargets.All,AllowMultiple = false, Inherited = true)]
public sealed class RoleAuthorizationAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
List<String> requiredRoles = Roles.Split(Convert.ToChar(",")).ToList();
List<Role> allRoles = new UsersService.UsersClient().GetUserRoles(filterContext.HttpContext.User.Identity.Name).ToList();
bool Match = false;
foreach (String s in requiredRoles)
{
foreach (Role r in allRoles)
{
string rName = r.RoleName.Trim().ToString();
string sName = s.Trim();
if (rName == sName)
{
Match = true;
}
}
}
if (!Match)
{
filterContext.Result = new ViewResult { ViewName = "AccessDenied" };
}
base.OnAuthorization(filterContext);
}
}
Pourriez-vous s'il vous plaît dites-moi ce que je fais de mal
source d'informationauteur drinu16
Vous devez vous connecter pour publier un commentaire.
Depuis que j'ai eu les rôles des utilisateurs dans la base de données, j'ai eu à vérifier la base de données j'ai donc inclus cette méthode dans le monde.asax
Alors je pourrais utiliser la normale
Sur le dessus de la actionResult méthodes dans les contrôleurs
Cela a fonctionné.
Si vous êtes en utilisant MVC 5, vous devez activer le chargement paresseux dans votre DbContext en insérant la ligne suivante dans votre DbContext initialisation.
MVC 5 projet par défaut, vous pourrez l'ajouter à ApplicationDbContext.cs fichier.
Je ne sais pas si c'est particulier à la MVC 5, à l'Identité 2.0, ou affecter les autres versions. Je suis à l'aide de cette installation et l'activation de chargement paresseux de faire tous le rôle par défaut de schéma fonctionne. Voir https://stackoverflow.com/a/20433316/2401947 pour plus d'info.
En outre, si vous êtes en utilisant ASP.NET Identité 2.0 d'autorisation par défaut de schéma, vous n'avez pas à mettre en œuvre Application_AuthenticateRequest que Darren mentionné. Mais si vous êtes à l'aide personnalisée de l'autorisation de tables, alors vous avez à mettre en œuvre.
Votre code d'origine était proche, mais le problème se situe ici:
Sans condition de l'appel de la classe de base signifie que vous êtes exigeant décoré de rôles pour être trouvé dans les DEUX UsersService et le Rôle intégré de fournisseur. Si le rôle de fournisseur n'est pas configuré pour renvoyer le même jeu de rôles (qui ne le serait pas si le défaut AuthorizeAttribute n'est pas suffisant pour vous), alors ce sera bien évidemment le résultat dans l'Autorisation test retourne toujours false.
Au lieu de cela, vous pourriez ajouter une propriété distincte de l'Attribut dérivé comme
et remplacer
avec:
Et décorer votre contrôleur comme tel: