Question

I fait un nouveau filtre d'action (attribut, similaire à [Authorize]) qui autorise l'accès à une action d'un contrôleur basé sur une valeur de session. Cependant, je suis décoration essentiellement toutes mes actions de contrôleur avec cet attribut (à l'exception de très peu).

Alors, je pensais que ce serait mieux d'avoir ce filtre d'action toujours exécuté sauf dans les cas où je joins un attribut [ExemptFromAuthorize] à une action de contrôleur? (Peut-être par l'intermédiaire héritant de ma classe Controller?)

Comment puis-je faire?

Était-ce utile?

La solution

Courir avec jeef3 la réponse de , je suis venu avec cela. Il pourrait utiliser plus la vérification des erreurs et de robustesse comme de multiples actions délimitées, mais l'idée générale fonctionne.

Dans votre cas, vous pouvez tester la valeur de la session et décide de revenir sur l'autorisation aussi.

public class AuthorizeWithExemptionsAttribute : AuthorizeAttribute
{
    public string Exemption { get; set; }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.RouteData.GetRequiredString("action") == Exemption)
            return;

        base.OnAuthorization(filterContext);
    }

}

Utilisation:

[AuthorizeWithExemptions(Roles="admin", ExemptAction="Index")]
public class AdminController : Controller
...

Autres conseils

Voir mon article sur CodeProject -

http://www.codeproject.com/KB/web-security/ AuthorizeWithExemptions.aspx

Dans cet article, je vais vous fournir une solution pour sécuriser les contrôleurs d'application ASP.NET MVC d'une manière que toutes les actions sont garantis, sauf ceux que vous définissez comme non sécurisé.

snipper du code:

public override void OnAuthorization(AuthorizationContext filterContext)
{
    ActionDescriptor action = filterContext.ActionDescriptor;
    bool IsUnsecured = action.GetCustomAttributes(
                         typeof(UnsecuredActionAttribute), true).Count() > 0;

    //If doesn't have UnsecuredActionAttribute - then do the authorization
    filterContext.HttpContext.SkipAuthorization = IsUnsecured;

    base.OnAuthorization(filterContext);
}

Je comprends la question est assez obsolète, mais de toute façon .. Si vous souhaitez appliquer le filtre à toutes les actions ajouter juste après les lignes dans Global.asax:

protected void Application_Start()
{
    // your code here and then
    RegisterGlobalFilters(GlobalFilters.Filters);
}    

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyActionFilterAttribute());
}

Et dans le filtre d'action, vous pouvez simplement vérifier si l'action a d'autres attributs comme suit:

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherActionAttribute), false))
    {
        // do what you want to do
    }
}

Peut-être essayer et d'ajouter une propriété Except à votre premier attribut?

[MyAuthenticate(Exempt="View")]
public class MyController : Controller
{
    public ActionResult Edit()
    {
        // Protected
    }

    public ActionResult View()
    {
        // Accessible by all
    }
}

Vous pouvez ajouter l'attribut à la classe d'avoir appliquer à toutes les méthodes de cette classe

[Authenticate]
public class AccountController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

Je ne sais pas comment exclure une méthode spécifique d'un attribut de niveau de classe. Peut-être utiliser un contrôleur distinct pour les demandes non authentifiées?

  

Pour toute personne lisant ceci en 2013+, MVC4 prend désormais en charge l'utilisation de   [AllowAnonymous]

     

Vous pouvez mettre sur le contrôleur Autorisez, puis Autoriser les connexions anonymes sur   toutes les fonctions que vous ne voulez pas autoriser.

     

Exemple:

     

[Authorize]   public class HomeController: {Controller

[AllowAnonymous]
public ActionResult Index()
{

} 
     

}

Est-ce que ce travail avec une coutume [MyAuthorize] filtre ou il ne fonctionne qu'avec [Authorize]

Pour toute personne lisant ceci en 2013+, MVC4 prend désormais en charge l'utilisation de [AllowAnonymous]

Vous pouvez mettre sur le contrôleur Autorisez, puis Autoriser les connexions anonymes sur toutes les fonctions que vous ne souhaitez pas autoriser.

Exemple:

[Authorize]
public class HomeController : Controller
{

    [AllowAnonymous]
    public ActionResult Index()
    {

    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top