Добавление страницы бритвы в проект .net Angular с удостоверением Microsoft не наследует авторизацию

При добавлении новой страницы бритвы в locahost/error/404 я не могу аутентифицировать пользователя. В верхнем меню есть регистрация и вход. Но если я нажму «Войти» и меня отправят на https://localhost/Identity/Account/Login, я пройду аутентификацию. Так что это происходит только на пользовательских страницах бритвы.

@page
@model WebApplication1.Pages.ErrorPages._404Model
@{
}
<h1>404 - THIS PAGE WAS NOT FOUND</h1>
@(User.IsInRole("Admin") ? ",AUTHENTICATED" : "NOT AUTHENTICATED")
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApplication1.Pages.ErrorPages
{
    public class _404Model : PageModel
    {
        public void OnGet()
        {
        }
    }
}

Я попробовал спросить И я попытался добавить разные детали и коды, например:

        private readonly DbContext _dbContext;
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly SignInManager<ApplicationUser> _signInManager;


        public IndexModel(DbContext context,
            UserManager<ApplicationUser> userManager,
            SignInManager<ApplicationUser> signInManager)
        {
            _dbContext = context;
            _userManager = userManager;
            _signInManager = signInManager;
        }

Я попытался проверить, есть ли у Program.cs какие-либо ограничения в отношении аутентификации только пользователей на определенных страницах.

Я добавил @(User.IsInRole("Admin") ? ",AUTHENTICATED" : "NOT AUTHENTICATED") на странице /Identity/Account, и все сработало. На моих пользовательских страницах это не сработало.

Проблема

Таким образом, проблема в том, что все основные страницы/представления .net, которые я создаю, не наследуют авторизацию. Похоже, что пользователь не авторизован (и в серверном коде пользователь не авторизован для этих страниц). Но если я вернусь на любую из страниц Microsoft Identity, он авторизован, или если я перейду на свою угловую страницу, я авторизован, так что это происходит только на моих пользовательских страницах в папке страниц.

Обновлено: Итак, все еще ища, что может быть не так, я обнаружил, что если я помещу свою страницу в папку Areas/Identity/Manage, пользователь аутентифицируется, и я могу это проверить. Но размещение файла в /Pages/... не позволит проверить подлинность пользователя. Если кто-нибудь знает, какие настройки ограничивают это, сообщите, пожалуйста.

Извините, но я не могу понять вашу проблему. Не могли бы вы поделиться, чего вы хотите достичь?

Tiny Wang 22.03.2024 11:33

Привет @TinyWang. Я добавил «Проблему» к вопросу, в котором указана проблема.

GerryMM88 22.03.2024 11:38

Хотите объяснить, что ваше приложение уже интегрирует удостоверение Microsoft, поэтому, когда вы нажимаете на одну из своих страниц, оно должно перенаправляться на страницу входа в систему, если ни один пользователь сейчас не прошел аутентификацию. Но вы обнаружили, что можете посещать все страницы без входа в систему. Если вы хотите войти в систему, вам нужно вручную нажать кнопку входа в меню?

Tiny Wang 22.03.2024 11:53

Нет @TinyWang. Я могу войти в систему с помощью Microsoft Identity и созданных там страниц. Это работает так, как ожидалось. Моя угловая страница также работает должным образом. Но когда я создаю пользовательскую страницу/представление в папке страниц, эта страница не может проверить, вошел ли пользователь в систему или нет. _userManager.GetUserAsync(User) вернет ноль. Но возврат ко всем другим страницам, кроме пользовательской, покажет, что пользователь вошел в систему. Так что это происходит только на моем пользовательском представлении/странице. Поэтому я хочу «наследовать» информацию и проверить на своей пользовательской странице, что пользователь вошел в систему.

GerryMM88 22.03.2024 12:06

это основное приложение Angular + asp.net, и аутентификация работала хорошо, на угловых страницах вы можете видеть, что пользователь вошел в систему. Теперь вы создаете пользовательскую страницу cshtml, вы также хотите просмотреть текущую информацию о пользователе, но вы обнаружили что в меню вы можете видеть только кнопку Login, которая вместо этого должна отображать имя пользователя, поскольку пользователь уже вошел в систему, я прав? Если да, то, возможно, для устранения неполадок потребуется минимальный воспроизводимый образец...

Tiny Wang 22.03.2024 12:14

@TinyWang, верно. И я создал минимальный воспроизводимый образец, см. файлы cshtml и cs в заданном выше вопросе. Меньше кода быть не может. Но даже в этом случае... Я не могу получить идентификатор пользователя на своей странице. Проблема не в том, что его нет в роли администратора, проблема в том, что он не аутентифицирован.

GerryMM88 22.03.2024 12:46

да, но я не могу воспроизвести проблему на своей стороне с помощью кодов, которыми вы поделились в вопросе...

Tiny Wang 22.03.2024 14:09

Итак, ваша страница может получить информацию о входе пользователя?

GerryMM88 22.03.2024 14:11

нет, я не могу создать образец для тестирования только с вашими фрагментами кода. Как вы создаете свой проект и как добавляете механизм аутентификации?

Tiny Wang 22.03.2024 14:16

Я использую стандартный OOB angular. Net основной проект в Visual Studio.

GerryMM88 22.03.2024 22:52

@TinyWang: см. последнее редактирование. Я смог увидеть информацию о пользователе, но только когда поместил страницу бритвы в конкретную папку. Не уверен, какая «настройка» это делает.

GerryMM88 23.03.2024 01:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
11
155
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Добавьте [Authorize] в модель страницы:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApplication1.Pages.ErrorPages
{   
   [Authorize]
   public class _404Model : PageModel
   {
      public void OnGet()
      {
      }
   }
 }

Несмотря на то, что я вошел в систему, я получаю: URL-адрес запроса: localhost: 44408/admin Метод запроса: Код состояния GET: 401 Несанкционированный удаленный адрес: [::1]:44408 Политика реферера: strict-origin-when-cross- источник

GerryMM88 21.03.2024 18:56
Ответ принят как подходящий

Итак, я нашел два похожих поста на stackoverflow, которые мне помогли, и это были следующие два:

User.Claims пуст для каждой страницы за пределами областей/идентификаторов

Как настроить аутентификацию и авторизацию для ASP .NET Core 3.0 с помощью PageModels?

В итоге я изменил свой Program.cs и добавил специальную авторизацию в свой обработчик, и все.

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
    options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
}).AddIdentityServerJwt();

И:

[Authorize(AuthenticationSchemes = "Identity.Application")]

И это было все!

Другие вопросы по теме

Обратная передача происходит при отправке формы, модель Blazor сбрасывается при отправке формы
Доступ к элементам внедрения зависимостей, таким как IConfiguration, из вложенного класса в консольном приложении Core
Конвейер сборки AzureDevops отменяется из-за тайм-аута во время команды сборки dot
Проблемы с уровнем журнала функции Azure, изолированные от dotnet
Как изменения базы данных управляются и развертываются в Azure DevOps при разработке приложений Blazor?
Почему BackgroundService не игнорирует исключения в зависимости от того, как они обрабатываются
Как перенаправить обратно на страницу «Создать» после авторизации
Каков правильный синтаксис для привязки списка объектов, содержащих дополнительные (вложенные) списки, при отправке форм?
.NET Core: кажущаяся и реальная сборка типа — это не одно и то же
После обновления Visual Studio до версии 17.9.3 среда IDE закрывается, и команда dotnet.exe сообщает о фатальной ошибке. Внутренняя ошибка CLR. (0x80131506)