2017-09-07 15 views
1

私はユーザーを承認する必要があるAuthorizationHandlerを.netコア2.0に実装しようとしています。アプリケーションの検証作業内で別のアクションメソッドにリダイレクトしたい条件に基づいています[OK]をクリックして、認証が失敗した場合に、ユーザーを[Access Denied]ページまたは[Login Denied]ページにリダイレクトする方法について説明します。ASP.NET Core 2.0 AuthorizationHandler、HandleRequirementAsyncメソッドからユーザーをリダイレクト

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

にリダイレクトすることができます承認要件からのリダイレクトを行うことは想定されていません。認証が失敗した場合の正しいページにリダイレクトするように、認証ハンドラを設定します。これは、通常、 'Startup'で行われます。ここでは、サポートする認証方法を定義します。 – juunas

答えて

2

私は解決策を見つけたと私は、これは、誰かが似て探しに役立つことを願って、カスタム認証に我々はAuthorizationFilterContextを使用して、任意の所望のコントローラのアクションへとあなたがいる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

は、上書きする前に拡張するクラスに言及します –

1

まず、このようなカスタムスキームを作成してログインページ/認証の条件を設定できます。アクセスが同様に/禁断のアクセスを拒否されたため

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. 
     } 
    } 

} 

は、その後、あなたが同様のクラスを作成することができます( SampleScheme2を言うことができます)。 最後に私は、コードが自己の十分な説明であると思います

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 => { }); 

あなたstartup.csでそれらを設定することができます。いくつかのバリエーションがありますので、これがあなたが行っていたこととまったく違うかどうかを私に知らせてください。

関連する問題