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:
- 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). - 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. - 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
Vous devez vous connecter pour publier un commentaire.
Pas totalement sûr que je l'obtenir, mais si vous créer un Personnalisé Autorisation Filtre qui hérite de System.Web.MVC.Autoriser l'attribut de ce genre.
Et de le décorer vos Méthodes à employer cette Autorisation que faire l'affaire?
OriginalL'auteur Jive Boogie
Concernant votre première exigence:
Comme vous l'avez déjà trouvé,
OnAuthorization
prend soin d'un certain nombre d'aspects, notamment, par exemple, la mise en cache.Si vous êtes uniquement intéressé par la personnalisation de la manière dont les informations d'identification d'utilisateur sont validés, je vous suggère d'aller pour remplacer
AuthorizeCore
à la place. E. g.:Vous pouvez également donner un coup d'oeil à ce que d'autres threads:
OriginalL'auteur superjos
Voici comment j'ai fait pour l'instant:
Il ne gère pas mon 3ème scénario, cependant, je vais donc la mettre en œuvre dans un gestionnaire d'erreurs globales.
OriginalL'auteur JustAMartin