【发布时间】: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