Question

Je me suis demandé si / comment je peux remplacer le comportement [autorise] par défaut dans ASP.NET MVC. Je sais que je peux créer un nouveau filtre d'action, faire mon propre attribut et ainsi de suite; Je suis simplement intéressé si je peux simplement modifier le comportement [autorise] et remplacer son travail par mon propre code?

Éditer: Les gars et les filles. J'apprécie votre contribution mais comme je l'ai écrit, je suis ne pas Vous cherchez à introduire un nouvel attribut [xyzAuthorize]. Je suis conscient de la façon de le faire. Je veux garder la notation [autorise] mais changer son fonctionnement.

Était-ce utile?

La solution

Oui, jetez un œil aux documents MSDN pour AutorizEAttribute: http://msdn.microsoft.com/en-us/library/system.web.mvc.AuthorizeTtribute.aspx.

Fondamentalement, vous pouvez remplacer la méthode OnAuthorisation () et personnaliser le comportement. Il existe également d'autres méthodes virtuelles sur l'attribut.

EDIT: Comme Bruno l'a souligné, vous pouvez remplacer la méthode AMPERSICECORE (). La principale différence étant qu'AmureCoreCore () prend une HttpContextBase, tandis que OnAuthorization () prend un AuthorizationContext. Une instance d'AutorisationContext vous fournit plus d'informations, telles que le contrôleur, le requestContext et le RoutAdata. Il vous permet également de spécifier un ActionResult.

AMPERIZECORE () est plus restreint dans les informations auxquelles vous pouvez accéder ainsi que le résultat, vous pouvez revenir, mais si vous avez besoin d'autoriser des données mise en cache, votre logique doit gérer le cas où vous n'avez aucune de ces données supplémentaires ( Étant donné que les données sont servies à partir du cache avant que la demande ne soit acheminée via le pipeline MVC).

Comme toujours, vous devez comprendre votre scénario et les outils et compromis disponibles entre eux.

Autres conseils

Vous pouvez sous-classer le filtre AutorizEatTribute et mettre votre propre logique à l'intérieur.

Voyons un exemple. Disons que vous souhaitez toujours autoriser les connexions locales. Cependant, s'il s'agit d'une connexion distante, vous souhaitez conserver la logique d'autorisation habituelle.

Vous pourriez faire quelque chose comme:

public class LocalPermittedAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return (httpContext.Request.IsLocal || base.AuthorizeCore(httpContext)));
        }
}

Ou vous pouvez toujours autoriser une certaine adresse distante (votre machine, par exemple).

C'est ça!

Edit: oublié de mentionner, vous l'utiliserez de la même manière que vous utiliserez le filtre AutorizEatTribute:

class MyController : Controller
{
    [LocalPermittedAuthorize]
    public ActionResult Fire()
    {
        Missile.Fire(Datetime.Now);
    }
}

Implémentez votre propre fournisseur de rôles et définissez votre application pour l'utiliser. Ensuite, l'attribut Authorize respectera votre code d'athorisation.

Je ne vois que 2 façons: remplacer AuthorizeAttribute.OnAuthorization Méthode ou création de votre propre attribut d'autorisation à partir de zéro.

1) Très facile:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        /// your behavior here
    }
}

2) Facile aussi - il suffit de regarder la source MVC ASP.NET, AutorizEAtTribute.cs dossier

Il semble que vous puissiez implémenter un filtre personnalisé comme d'habitude (et hériter d'autoriseatTribute si vous le souhaitez), puis créer un nouvel ActionInvoker qui hérite ContrôleurInvoker et remplace les fichiers. Dans GetFilters, vous appelez base.GetFilters() Pour obtenir la liste des filtres, les itération via les autorités et remplacez les appels pour autoriser le fichier par des appels à votre filtre personnalisé.

Un autre moyen potentiel consiste à mettre en œuvre des fournisseurs d'adhésion et de rôle personnalisés, selon ce que vous essayez de faire.

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