ASP.NET Core Identity 干扰 StatusCodePages 404 中间件

问题描述 投票:0回答:1

我正在将 ASP.NET Core Razor Pages 7 与 Identity 结合使用。假设我导航到:

/non-existent-page

我希望它显示 404 页面,但它实际上重定向到登录页面并显示:

/login/?return=%2Fnon-existent-page

我登录后,会重定向到404页面。

我的配置:

  • 启动配置包括:
    services.AddAuthorization(x => {
      x.FallbackPolicy = x.DefaultPolicy;
    });
    
  • 状态码中间件放在其他中间件之前:
    app.UseStatusCodePagesWithReExecute("/error", "?statusCode={0}")
    
  • 中间件顺序:异常处理程序、状态代码、静态文件、路由、authn、authz、razor 页面、控制器
  • 错误页面有
    [AllowAnonymous]
  • 错误 PageModel 类有
    public void OnGet(int statusCode) { }

我该如何解决这个问题?

asp.net-core .net-core razor-pages asp.net-core-identity asp.net-core-7.0
1个回答
0
投票

我从文档中的此页面找到了解决此问题的方法。但是,该代码不正确

但是,这个更新后的代码确实有效:

public class NotFoundAwareAuthorizationMiddlewareResultHandler : IAuthorizationMiddlewareResultHandler
{
    private readonly AuthorizationMiddlewareResultHandler _defaultHandler = new();

    public async Task HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult)
    {
        if (authorizeResult.Challenged && context.GetEndpoint() == null)
        {
            context.Response.StatusCode = StatusCodes.Status404NotFound;
            return;
        }
        await _defaultHandler.HandleAsync(next, context, policy, authorizeResult);
    }

}

尽管它对我有用,但我不确定它是否完全合适。例如:

  • 原始代码检查
    authorizeResult.Forbidden
    ,我认为在这种情况下毫无意义
  • 它还会检查
    authorizeResult.AuthorizationFailure!.FailedRequirements
    但始终为空
  • 我的代码检查
    context.GetEndpoint() == null
    ,这是丢失页面的情况,而对于现有页面来说它将是非空的;我希望那里没有问题

我在 docs repo 中添加了一个问题,要求他们修复它。如果您也需要的话请点赞

如果您有更好的方法,或者在我的代码中发现错误,请添加答案,我会接受它。

© www.soinside.com 2019 - 2024. All rights reserved.