Question

Je suis en train d'ajouter l'autorisation à mes contrôleurs et il ne fonctionne pas ...

Je ne sais pas où regarder dans mon programme, mais en ajoutant la balise

[Authorize] 

filtre dans mon contrôleur ne fonctionne pas, et encore moins quelque chose comme

[Authorize(Roles = "Manager")]

Je suis en mesure d'obtenir ce travail dans l'application par défaut qui est fourni lors de la création d'un nouveau projet MVC (par exemple, je suis capable de faire le « à propos » onglet redirect à l'écran de connexion si je ne suis pas connecté) , donc je suppose que j'ai sali les choses le long du chemin comme je l'ai construit mon application. Est-ce que quelqu'un sait où je devrais regarder pour résoudre ce problème? J'ai utilisateurs et ils ont des rôles; J'utilise le schéma ASP.net qui est créé automatiquement; Je l'ai examiné mon fichier web.config de haut en bas et même si je suis assez nouveau pour cela, rien ne semble hors de propos. Je n'ai pas la moindre idée pourquoi mes filtres d'autorisation ne fonctionnent pas.?.

Était-ce utile?

La solution

J'ai écrit un attribut personnalisé pour résoudre ce problème. Vous pouvez attribuer vos méthodes de commande comme suit:

[RequiresRole(Role="Admin")]
public ActionResult Index()
{
    int i = 5 + 5;

    return View();
}

Le code pour l'attribut est le suivant ....

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace Web.Controllers
{
    public class RequiresRoleAttribute : ActionFilterAttribute
    {
        public string Role { get; set; }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (string.IsNullOrEmpty(Role))
            {
                throw new InvalidOperationException("No role specified.");
            }

            string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;
            string redirectUrl = string.Format("?returnUrl={0}", redirectOnSuccess);
            string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;

            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                filterContext.HttpContext.Response.Redirect(loginUrl, true);
            }
            else
            {
                bool isAuthorised = filterContext.HttpContext.User.IsInRole(this.Role);
                if (!isAuthorised)
                {                        
                    filterContext.HttpContext.Response.Redirect(loginUrl, true);
                }                
            }  
        }      
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top