错误处理没有按预期工作
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。
我仍在努力掌握 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。