AuthorizeAttribute personnalisé avec authentification personnalisée

Je suis en utilisant ASP.NET MVC 4 Web application front-end pour certains services WCF.
Tous les utilisateurs de se connecter/déconnecter et de contrôle de session se fait sur le back-end. MVC application ne doit stocker un seul cookie avec un IDENTIFIANT de session. Mon client n'autorise pas l'utilisation de l'Authentification par Formulaires, tout doit être personnalisé.

J'ai mis en place sur mon site internet.config:

  <system.web>
...
    <authentication mode="None" />
  </system.web>

  <system.webServer>
    <modules>
...
      <remove name="FormsAuthentication" />
...    
    </modules>
  </system.webServer>

J'ai aussi un filtre global:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //Force all actions to request auth. Only actions marked with [AllowAnonymous] will be allowed.
        filters.Add(new MyAuthorizeAttribute());
    }
}

qui est appelé Mondiale.asax

   FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

J'ai marqué avec [AllowAnonymous] chaque contrôleur et l'action qui n'a pas besoin d'autorisation.

Et maintenant, je dois mettre en œuvre MyAuthorizeAttribute. J'ai essayé quelques tutoriels, mais aucun d'entre eux de correspondre totalement à mes scénarios.

En gros, je dois gérer les scénarios suivants pour chaque action:

  1. Si il y a un cookie valide, la demande actuelle doit être considérée comme
    autorisé (il n'y aura pas tous les rôles de vérifier, d'une seule catégorie d'utilisateurs).
  2. Si il n'y a pas de cookie, je devrais
    remplacer la valeur par défaut MVC gestionnaire (qui essaie de charger un Compte/Login)
    et rediriger les utilisateurs vers Home/Index page avec un message indiquant que l'utilisateur
    connectez-vous de.
  3. Si la WCF à l'appel de la méthode jette
    FaultException où notre coutume SecurityFault dit
    cette session a expiré (SecurityFault a une coutume champ enum
    qui contient la raison de l'exception), je dois détruire ma personnalisé
    cookie de session et de nouveau rediriger l'utilisateur vers d'Accueil/page d'Index avec un
    message pour que l'utilisateur doit ouvrir une session à cause de sa dernière session, a
    expiré. Pour tous les autres SecurityFaults je peux les laisser aller par le biais - je
    avoir un gestionnaire d'erreurs globales.

Comme je le comprends, j'ai besoin de remplacer AuthorizeCore (à vérifier mon cookie pour voir si la session existe et est toujours valable) et HandleUnauthorizedRequest (pour rediriger les utilisateurs de la Maison/Index au lieu de la valeur par défaut de la page de Login).

Pour la redirection, j'ai essayé:

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {            
        base.HandleUnauthorizedRequest(filterContext);
        filterContext.Result = new RedirectResult("/Home/Index/NeedsLogin");
    }

qui semble gérer le scénario 2e fine (je ne suis pas sûr que la base de l'appel, bien que - est-il nécessaire?).

Pour le 1er scénario, j'ai besoin de mettre en œuvre AuthorizeCore. Je ne suis pas sûr, comment le faire correctement. J'ai vu que AuthorizeAttribute a un peu de code pour la manipulation de la mise en cache des situations et peut-être beaucoup plus cachés de la fonctionnalité et je ne veux pas le casser.

Pour la 3ème scénario, je ne suis pas sûr si MyAuthorizeAttribute sera en mesure de gérer. Peut AuthorizeAttribute attraper les exceptions qui se produisent à l'intérieur de l'Action, ou je vais avoir à gérer SecurityFault.SessionExpired les situations dans mon gestionnaire d'erreurs globales?

OriginalL'auteur JustAMartin | 2012-10-01