Filtre d’autorisation personnalisé dans ASP.NET MVC 5?

Dans ASP.NET MVC 5, nous pouvons utiliser l’atsortingbut [Authorize] pour vérifier l’autorisation et limiter l’access à certaines actions \ pages. Je me demande comment puis-je modifier cet atsortingbut – l’autorisation doit être vérifiée après un certain temps? Par exemple, laissez un utilisateur non autorisé voir la page pendant 10 minutes, puis bloquez l’access .

Mise à jour: il semble que ma question n’était pas claire et j’ai donc mis le problème en gras. Je dois compter le temps que chaque utilisateur non autorisé a passé sur le site, puis le bloquer au bout de N minutes.

Vous pouvez implémenter une autorisation personnalisée pour autoriser la navigation anonyme pendant une durée limitée, comme ceci:

 public class AuthorizeAtsortingbuteWithAnonTimeoutAtsortingbute : AuthorizeAtsortingbute { public int? AnonymousMinutesTimeout { get; set; } public override void OnAuthorization(AuthorizationContext filterContext) { // Let default handling occurs base.OnAuthorization(filterContext); // If result is set, authorization has already been denied, // nothing more to do. if (filterContext.Result as HttpUnauthorizedResult != null) return; var isAnonAllowed = filterContext.ActionDescriptor.IsDefined( typeof(AllowAnonymousAtsortingbute), true) || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined( typeof(AllowAnonymousAtsortingbute), true); if (isAnonAllowed && AnonymousMinutesTimeout.HasValue && // Not authorized !AuthorizeCore(filterContext.HttpContext)) { const ssortingng visitStartCookieName = "visitStartCookie"; const ssortingng visitStartDateFormat = "yyyyMMddhhmmss"; var visitStartCookie = filterContext.HttpContext.Request .Cookies[visitStartCookieName]; var now = DateTime.UtcNow; DateTime visitStartDate; var visitStartCookieValid = visitStartCookie != null && DateTime.TryParseExact(visitStartCookie.Value, visitStartDateFormat, null, DateTimeStyles.AssumeUniversal, out visitStartDate); if (!visitStartCookieValid) { visitStartDate = now; filterContext.HttpContext.Response.Cookies.Add( // Session cookie. (Need to set an expiry date if // a "permanent" cookie is wished instead.) new HttpCookie { Name = "visitStartCookie", Value = now.ToSsortingng(visitStartDateFormat) }); } if (visitStartDate.AddMinutes(AnonymousMinutesTimeout.Value) < now) { // Anonymous visit timed out HandleUnauthorizedRequest(filterContext); return; } } } } 

Ensuite, utilisez-le comme filtre global si cela vous convient, comme ceci:

 public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add( new AuthorizeAtsortingbuteWithAnonTimeoutAtsortingbute { // By example, 10 minutes AnonymousMinutesTimeout = 10 }); // Your other filters ... } 

Et n'oubliez pas de décorer vos contrôleurs ou vos actions avec AllowAnonymousAtsortingbute :

 [AllowAnonymous] public class YourController { } 

Ou

 public class YourController { [AllowAnonymous] public ActionResult YourAction() { } } 

Vous pouvez également placer votre atsortingbut d’autorisation personnalisé directement sur les contrôleurs ou les actions si sa définition globale ne vous convient pas:

 // By example, 10 minutes anonymous browsing allowed. [AuthorizeAtsortingbuteWithAnonTimeout(AnonymousMinutesTimeout = 10)] public class YourController { } 

Veuillez noter que cette implémentation ne sécurise pas le délai d'expiration anonyme. Un pirate informatique peut le surmonter et naviguer anonymement aussi longtemps qu'il le souhaite. Les outils du navigateur permettent la suppression des cookies, il est donc facile de commencer avec un nouveau délai.
Mon exemple vient également de définir un cookie de session, qui disparaîtra en fermant / réouvrant le navigateur. Bien sûr, l'utilisation d'un autre navigateur ou d'un autre appareil vous permettra 10 autres minutes d'utilisation.

Sécuriser un délai anonyme est assez difficile, car votre utilisateur est anonyme. Vous pouvez essayer d’identifier vos utilisateurs anonymes à partir de leurs caractéristiques techniques, puis de suivre leurs délais d’exposition côté serveur.
Mais vous rencontrerez probablement de nombreux problèmes: les utilisateurs d'entreprise qui naviguent avec la même adresse IP ou qui basculent entre des adresses IP différentes car ils ne disposent pas d'une seule connexion Internet, ...

Quelque chose comme ça? Créez votre propre atsortingbut et remplacez la valeur par défaut par votre propre code.

 public class CustomAuthAtsortingbute : AuthorizeAtsortingbute { public override void OnAuthorization(AuthorizationContext filterContext) { base.OnAuthorization(filterContext); //your code here } } 

Puis décorez vos contrôleurs / actions avec [CustomAuthAtsortingbute]

Ci-dessous, j’ai énuméré quelques exemples indiquant où et pourquoi utiliser AuthorizeAtsortingbute.

1.Vérifiez l’autorisation et limitez l’access aux actions.

 Example : // Ressortingct unauthorized access: [Authorize] public ActionResult YourActionView() { return View(); } // Ressortingct by user: [Authorize(Users = "prashant,lua")] public ActionResult YourActionView() { return View(); } // Ressortingct by role: [Authorize(Roles="Administrators")] public ActionResult YourActionView() { return View(); } 

2.Vérifiez l’autorisation et limitez l’access au contrôleur.

  // Ressortingct unauthorized access: [Authorize] public class ValuesController : ApiController { } // Ressortingct by user: [Authorize(Users="Prashant,Lua")] public class ValuesController : ApiController { } // Ressortingct by role: [Authorize(Roles="Administrators")] public class ValuesController : ApiController { } 

Je pense que l’atsortingbut Authorize est conçu pour faciliter le processus d’autorisation. Si vous souhaitez autoriser un utilisateur anonyme à afficher votre site et à bloquer l’access au bout d’un moment, envisagez l’utilisation de scripts côté client.