2016-07-08 1 views
2

Je travaille sur le noyau asp.net et je ne comprends pas certaines choses. par exemple dans mvc.net 5, nous pouvons filtrer et d'autoriser l'action à créer la classe de AuthorizeAttribute et jeu d'attributs à des actions comme celle-ci:Attributs d'autorisation personnalisés dans ASP.NET Core

public class AdminAuthorize : AuthorizeAttribute { 
     public override void OnAuthorization(AuthorizationContext filterContext) { 
      base.OnAuthorization(filterContext); 
      if (filterContext.Result is HttpUnauthorizedResult) 
       filterContext.Result = new RedirectResult("/Admin/Account/Login"); 
     } 
    } 

mais dans le noyau de asp.net nous n'avons pas AuthorizeAttribute ... Comment est-ce que je peux placer le filtre comme ceci dans le noyau d'asp.net pour des actions faites sur commande?

Répondre

7

Vous pouvez utiliser le middleware d'authentification et Authorize attirbute pour rediriger la page de connexion. Pour votre cas également en utilisant AuthenticationScheme semble raisonnable.

Première utilisation (je suppose que vous voulez utiliser un middleware cookie) middleware d'authentification par cookie:

 app.UseCookieAuthentication(new CookieAuthenticationOptions() 
     { 
      AuthenticationScheme = "AdminCookieScheme", 
      LoginPath = new PathString("/Admin/Account/Login/"), 
      AccessDeniedPath = new PathString("/Admin/Account/Forbidden/"), 
      AutomaticAuthenticate = true, 
      AutomaticChallenge = true, 
      CookieName="AdminCookies" 
     }); 

puis utilisez Authorize attribut avec ce schéma:

[Authorize(ActiveAuthenticationSchemes = "AdminCookieScheme")] 

Une autre option est d'utiliser UseWhen pour séparer admin et authentification par défaut:

 app.UseWhen(x => x.Request.Path.Value.StartsWith("/Admin"), builder => 
     { 
      builder.UseCookieAuthentication(new CookieAuthenticationOptions() 
      { 
       LoginPath = new PathString("/Admin/Account/Login/"), 
       AccessDeniedPath = new PathString("/Admin/Account/Forbidden/"), 
       AutomaticAuthenticate = true, 
       AutomaticChallenge = true 
      }); 
     }); 

Et puis utilisez simplement l'attribut Authorize.

+0

y a-t-il une autre façon? – Moein

+0

Si vous voulez dire un autre moyen sans middleware d'authentification, je dirais "non" à des fins d'authentification. Mais pour le branchement (admin, par défaut, etc.), il peut y avoir une autre façon, par exemple 'MapWhen'. –