【问题标题】:Error handling not quite working as expectedASP.NET Core 5 MVC - 错误处理无法按预期工作 - [已解决]
【发布时间】:2021-11-16 06:22:19
【问题描述】:

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

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

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

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

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

不幸的是 - 这不是发生的事情 - 相反,我收到一个错误:

HTTP 错误 404
没有找到该网址的网页: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 不记名令牌一起使用。

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

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

@Xerillio - 你真的很接近 - 我在互联网上的某个地方再次搜索时发现了这个 - 这确实有效并且完全符合我的要求:

services.Configure<CookieAuthenticationOptions>(CookieAuthenticationDefaults.AuthenticationScheme, options =>
        {
            options.AccessDeniedPath = new PathString("/Error/AccessDenied");
        });

【问题讨论】:

  • 当您使用 MS 的“正常”身份时,您应该有一个区域/身份文件夹。 /Account/* 是其中的一部分,封装在 DLL 中。使用 Scaffolding 将其代码添加到您的项目中。
  • @HenkHolterman:谢谢 - 我使用了 ASP.NET Core Web 应用程序,带有 Razor 页面,并使用 MS Identity 作为我的身份验证方案 - 但我没有像 Areas/Identity 文件夹或类似的东西
  • 您是使用入门模板还是将包添加到“空 Web 应用程序”?脚手架可能仍然有效,请在临时项目中尝试一下。
  • @HenkHolterman:我只是使用了 VS 2019 自带的默认模板
  • std 模板有一个身份验证组合框,显示的是什么?

标签: c# error-handling asp.net-core-mvc asp.net-core-5.0


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我已经分享了我的身份验证设置 - 我正在使用 OpenID Connect,我相信它确实使用了 JWT 不记名令牌(返回一个 ID 令牌)。
  • 我尝试将 ConfigureApplicationCookie 调用添加到我的 Startup/ConfigureServices 方法,但错误保持不变,我没有看到任何更改/改进...
  • 你真的很接近 - 看看我更新的问题 - 不知何故,我只需要使用我在某处(而不是你的)找到的那个陈述来让它真正起作用。谢谢你的回答,不过!你派我去寻找正确的方向。接受。
  • @marc_s 很高兴听到这个消息!但是,您似乎也可以将其配置为AddMicrosoftIdentityWebApp 的一部分(最后一个重载采用 CookieAuthenticationOptions)。无论如何应该给你同样的结果。
猜你喜欢
  • 1970-01-01
  • 2019-09-25
  • 2016-07-27
  • 2019-06-26
  • 2014-03-26
  • 1970-01-01
  • 2023-02-06
  • 2014-07-02
  • 1970-01-01
相关资源
最近更新 更多