错误处理没有按预期工作

Error handling not quite working as expected

我仍在努力掌握 ASP.NET Core 5 MVC 的前端开发 - 我仍在努力解决有关错误处理的一些问题。

我已经为我的应用程序定义了一些角色 - 我在我的一些 Razor 页面(它们的“代码隐藏”PageModel class)上将它们用作 [Authorize(Roles="Admin")] 注释:

[Authorize(Roles="Admin")]
public class MyCustomPageModel : PageModel
{
    // page model code
}

然后我还在 Error 文件夹中创建了一个 Razor 页面 AccessDenied.cshtml

我现在的期望是:如果用户未被授权,或者不是指定角色的成员,那么 ASP.NET Core 将抛出错误(http 401 - 未经授权)并转到我的错误页面并显示它。

不幸的是 - 事实并非如此 - 相反,我得到了一个错误:

HTTP ERROR 404
No webpage was found for the web address: https://localhost:44332/Account/AccessDenied?ReturnUrl=%2FMyCustomMethod

我不明白 Account/ 是从哪里来的 - 我从来没有在任何地方定义它(据我所知 - 尽管有限 - )。

我还尝试通过在 Startup.Configure 方法(对于 env.IsDevelopment() 分支)中执行此操作来专门指示运行时使用 /Error 页面进行错误处理:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            // app.UseDeveloperExceptionPage();
            app.UseExceptionHandler("/Error");
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

但这并没有改变任何东西.....

所以 - 我错过了什么? Account/ 是从哪里来的 - 我该如何影响它? (例如,将 /Account/AccessDenied 替换为 /Error/AccessDenied

更新: 我使用“Microsoft Identity Platform”身份验证类型选项创建了这个应用程序;我正在使用 OpenID Connect 和 JWT Bearer Tokens。

这是我在 Startup class - ConfigureServices 中设置的方法:

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
         .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"));
            
services.AddAuthorization();

我猜您正在使用应用程序 cookie 作为您的身份验证方案(而不是 JWT/bearer 令牌)。如果没有,请分享您的 Startup.ConfigureServices 以展示您如何设置身份。

如果我是正确的,您应该能够配置在 HTTP 状态代码 403 禁止响应的情况下应用程序应重定向到的路径。 401 Unauthorized 通常是指用户根本未获得授权(未登录),而不是“只是”没有适当的角色。

要配置路径,如果您不想使用标准 /Account/AccessDenied,请在 Startup.ConfigureServices 中添加以下内容:

services.ConfigureApplicationCookie(options =>
{
    options.AccessDeniedPath = "/Error/AccessDenied";
});

有关配置此 cookie(和其他身份配置)的更多信息,请查看 Identity documentation