2017-09-07 6 views
1

J'essaie d'implémenter AuthorizationHandler dans .net core 2.0 où j'ai besoin d'autoriser l'utilisateur et basé sur la condition voulue pour rediriger vers différentes méthodes d'action dans mes travaux de validation d'application ok mais comment je peux rediriger l'utilisateur à la page Accès refusé ou Connexion lorsque l'autorisation a échoué.ASP.NET Core 2.0 Rediriger l'utilisateur depuis AuthorizationHandler, HandleRequirementAsync méthode

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, HasPermissionRequirement requirement) 
    { 
     var controllerContext = context.Resource as AuthorizationFilterContext; 

     if (sessionManager.Session.sysUserID <= 0) 
     { 
      controllerContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Account", action = "Login", area = "" })); 

      return Task.FromResult(0); 
     } 


      if (Utilities.GetInt32Negative(PermissionID) == 1 || Utilities.GetInt32Negative(PermissionID) == -1) 
      { 
       if (!PagePath.Equals("~/")) 
        controllerContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "NoAccess", area = "" })); 
      } 

      context.Succeed(requirement); 
     } 
     else 
     { 
      if (!PagePath.Equals("~/")) 
       controllerContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "NoAccess", area = "" })); 
     } 

     return Task.FromResult(0); 
    } 
+0

Vous êtes pas censé faire des redirections à partir des exigences d'autorisation. Configurez votre gestionnaire d'authentification pour rediriger vers les pages correctes lorsque l'autorisation échoue. Cela se fait généralement dans 'Startup', où vous définissez les méthodes d'authentification que vous prenez en charge, etc. – juunas

Répondre

2

J'ai trouvé la solution et j'espère que cela aidera quelqu'un qui cherche la même, dans l'autorisation de mise sur mesure, nous pouvons rediriger à toute action de commande désirée à l'aide du AuthorizationFilterContext et avec le RedirectToActionResult

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, HasPermissionRequirement requirement) 
{ 
    // Get the context  
    var redirectContext = context.Resource as AuthorizationFilterContext; 
    //check the condition 
    if (!result) 
    { 
     redirectContext.Result = new RedirectToActionResult("AccessDenied", "Home", null); 
     context.Succeed(requirement); 
     return Task.CompletedTask; 
    } 
    context.Succeed(requirement); 
    return Task.CompletedTask; 
} 
+0

mentionnez la classe à étendre avant de surcharger –

1

Vous pouvez d'abord configurer les conditions de connexion/authentification en créant un schéma personnalisé comme celui-ci.

public class SampleScheme : AuthenticationHandler<AuthenticationSchemeOptions> 
{ 
    public const string SchemeName = "sample"; 

    public SampleScheme(IOptionsMonitor<AuthenticationSchemeOptions> options, 
     ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) 
        : base(options, logger, encoder, clock) 
    { 
    } 

    protected override async Task<AuthenticateResult> HandleAuthenticateAsync() 
    { 
     if (myconditions){ 
      return AuthenticateResult.Fail("error message"); 
     } 
     else { 
      return await Context.AuthenticateAsync 
      (CookieAuthenticationDefaults.AuthenticationScheme); 
      // return default cookie functionality. 
     } 
    } 

} 

Ensuite, vous pouvez créer une classe similaire pour Accès refusé/accès interdit et (permet de dire SampleScheme2). Enfin, vous pouvez les mettre dans votre startup.cs

services.AddAuthentication(options => { 
    options.DefaultAuthenticateScheme = SampleScheme.SchemeName; 
    options.DefaultForbidScheme = SampleScheme2.SchemeName; 
}) 
.AddCookie(options => { 
    options.LoginPath = "/login"; 
    options.AccessDeniedPath = "/forbidden"; 
}) 
.AddScheme<AuthenticationSchemeOptions, SampleScheme>(SampleScheme.SchemeName, o => { }); 
.AddScheme<AuthenticationSchemeOptions, SampleScheme2>(SampleScheme2.SchemeName, o => { }); 

J'espère que le code est auto assez explicite. Il y a quelques variations alors laissez-moi savoir si ce n'est pas exactement ce que vous vouliez.