【问题标题】:Redirecting to a custom error page when a authorization policy fails授权策略失败时重定向到自定义错误页面
【发布时间】:2019-10-01 22:13:09
【问题描述】:

我已经创建了一个授权策略并在 startup.cs 文件中注册了处理程序。当策略失败时,我想将用户重定向到自定义错误页面,但总是被重定向到 /Account/AccessDenied?ReturnUrl=MyPage。我似乎无法弄清楚如何注册自定义错误页面。我尝试了一些选项,例如拥有 app.UseStatusCodePages。任何帮助是极大的赞赏 启动。铯

    public void ConfigureServices(IServiceCollection services)
            {
                services.AddAuthorization(options =>
               {

                   options.AddPolicy("HomePolicyTestPolicy", policy => policy.Requirements.Add(new AuthorizedPermissionsRequirement(new List<UserPermissionsEnum>() { UserPermissionsEnum.ADEAdmin })));
               });
                services.AddSingleton<IAuthorizationHandler, AuthorizedPermissionsHandler>();

            }

            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IHostingEnvironment env, IHttpContextAccessor accessor)
            {
                if (env.IsLocalOrDevelopment())
                {
                    app.UseExceptionHandler("/Home/Error");
                    // app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseExceptionHandler("/Home/Error");
                    app.UseHsts();
                }

                app.UseStaticFiles();
                app.UseAuthentication();
                app.UseSession();

                app.UseStatusCodePages(async context =>
                {
                    if (context.HttpContext.Response.StatusCode == 403)
                    {
                        context.HttpContext.Response.Redirect("/Error/Index");
                    }
                });


            }
Handler:

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AuthorizedPermissionsRequirement requirement)
            {
                context.Fail();

                return Task.CompletedTask;
            }
Controller:

     [Authorize(Policy = "HomePolicyTestPolicy")]
            public IActionResult PolicyTest()
            {
                return View();
            }

结果:它总是将我重定向到 /Account/AccessDenied?ReturnUrl=PolicyTest。我不知道让它重定向到 Home/Error。

【问题讨论】:

  • 把Startup.cs的相关内容贴出来会很有帮助
  • @ShahzadHassan 请看上面的代码。谢谢
  • 您需要将呼叫移至UseStatusCodePages,然后移至UseStaticFiles。顺序很重要,否则你的中间件在生成 403 后将得不到响应。
  • 我也试过了,当它到达 usestatuscode 中间件时,它已经在 /Account/AccessDenied 上找不到 404。
  • 能否将示例代码上传到GitHub?我认为您的端出了点问题。

标签: asp.net-core


【解决方案1】:

可以使用状态码页面中间件,查看handle errors

app.UseStatusCodePages(async context => {
  if (context.HttpContext.Response.StatusCode == 403)
  {
     // redirect to page
  }
});

【讨论】:

  • 你好 Zach,我试过这样做,但可以让它工作。我已经用代码更新了问题。谢谢
【解决方案2】:

实现这一点的最佳方法是不要使用 context.Fail(),而是这样做:

替换:

context.Fail();

与:

var mvcContext = context.Resource as AuthorizationFilterContext;
mvcContext.Result = new RedirectToActionResult("MyAction", "MyController", null);
context.Succeed(requirement);

允许上下文成功,将执行上下文,现在是重定向。

【讨论】:

    猜你喜欢
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 2014-07-27
    • 2013-05-04
    • 1970-01-01
    • 2011-02-24
    相关资源
    最近更新 更多