ASP.NET Ядро 5 MVC — обработка ошибок работает не совсем так, как ожидалось — [РЕШЕНО]

#c# #error-handling #asp.net-core-mvc #asp.net-core-5.0

Вопрос:

Я все еще пытаюсь освоить интерфейсную разработку с помощью ASP.NET Core 5 MVC — и я все еще борюсь с некоторыми проблемами, связанными с обработкой ошибок.

Я определил ряд ролей для своего приложения — и я использую их в качестве [Authorize(Roles="Admin")] аннотаций на некоторых из моих страниц Razor (их класс PageModel «code-behind»).:

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

Затем я также создал страницу Razor AccessDenied.cshtml в Error папке:

введите описание изображения здесь

Теперь я ожидаю: если пользователь не авторизован или не входит в указанную роль, то ASP.NET Ядро выдаст ошибку (http 401 — несанкционированный), перейдет на мою страницу ошибок и отобразит ее.

К сожалению — это не то, что происходит — вместо этого я получаю ошибку:

ОШИБКА HTTP 404
Веб-страница для веб-адреса не найдена: https://localhost:44332/Account/AccessDenied?returnUrl=/MyCustomMethod

Я не понимаю, откуда это Account/ берется — я никогда нигде не определял это (по моим — хотя и ограниченным — знаниям).

Я также попытался специально проинструктировать среду выполнения использовать /Error страницы для обработки ошибок, выполнив это в Startup.Configure методе (для env.IsDevelopment() ветви):

     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»; Я использую 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");
        });
 

Комментарии:

1. Когда вы используете «обычное» удостоверение от MS, у вас должна быть папка «Области/удостоверения». /Учетная запись/* является частью этого, сохранена в DLL. Используйте строительные леса, чтобы добавить его код в свой проект.

2. @HenkHolterman: спасибо — я использовал ASP.NET Основное веб — приложение, со страницами Razor и с MS Identity в качестве схемы аутентификации, но у меня нет ничего похожего на Areas/Identity папку или что-то подобное

3. Вы использовали стартовый шаблон или добавили пакеты в «пустое веб-приложение»? Строительные леса все еще могут работать, попробуйте это в проекте с нуля.

4. @HenkHolterman: Я просто использовал шаблоны по умолчанию, которые поставляются с VS 2019

5. В шаблоне std есть поле для проверки подлинности, что это показывало?

Ответ №1:

Я предполагаю, что вы используете файл cookie приложения в качестве схемы аутентификации (а не, например, токены JWT/на предъявителя). Если нет, пожалуйста, поделитесь своим Startup.ConfigureServices , чтобы показать, как вы настраиваете личность.

Если я прав, вы должны иметь возможность настроить путь, на который приложение должно перенаправляться в случае ответа с кодом состояния HTTP 403 «Запрещено». 401 Несанкционированный, как правило, происходит, когда пользователь вообще не авторизован (не вошел в систему), а не «просто» не имеет соответствующей роли.

Чтобы настроить путь, если вам не нужен стандарт /Account/AccessDenied , добавьте в него следующее Startup.ConfigureServices , что должно сработать:

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

Для получения дополнительной информации о настройке этого файла cookie (и другой конфигурации идентификации) ознакомьтесь с документацией, удостоверяющей личность.

Комментарии:

1. Я поделился настройками аутентификации — я использую OpenID Connect, который, как я полагаю, использует токены на предъявителя JWT (возвращает идентификационный токен).

2. Я попытался добавить этот ConfigureApplicationCookie вызов в свой метод запуска/настройки, но ошибка остается прежней, я не вижу никаких изменений/улучшений…

3. Вы были действительно близки — смотрите мой обновленный вопрос — так или иначе, мне просто нужно было использовать это утверждение, которое я где-то нашел (а не ваше), чтобы оно действительно сработало. Тем не менее, спасибо за ваш ответ ! Ты направил меня на поиски в правильном направлении. Принято.

4. @marc_s рад это слышать! Тем не менее, похоже, что вы также можете настроить его как часть AddMicrosoftIdentityWebApp (последняя перегрузка требует CookieAuthenticationOptions). В любом случае, это должно дать вам тот же результат.