При добавлении новой страницы бритвы в 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/... не позволит проверить подлинность пользователя. Если кто-нибудь знает, какие настройки ограничивают это, сообщите, пожалуйста.
Привет @TinyWang. Я добавил «Проблему» к вопросу, в котором указана проблема.
Хотите объяснить, что ваше приложение уже интегрирует удостоверение Microsoft, поэтому, когда вы нажимаете на одну из своих страниц, оно должно перенаправляться на страницу входа в систему, если ни один пользователь сейчас не прошел аутентификацию. Но вы обнаружили, что можете посещать все страницы без входа в систему. Если вы хотите войти в систему, вам нужно вручную нажать кнопку входа в меню?
Нет @TinyWang. Я могу войти в систему с помощью Microsoft Identity и созданных там страниц. Это работает так, как ожидалось. Моя угловая страница также работает должным образом. Но когда я создаю пользовательскую страницу/представление в папке страниц, эта страница не может проверить, вошел ли пользователь в систему или нет. _userManager.GetUserAsync(User) вернет ноль. Но возврат ко всем другим страницам, кроме пользовательской, покажет, что пользователь вошел в систему. Так что это происходит только на моем пользовательском представлении/странице. Поэтому я хочу «наследовать» информацию и проверить на своей пользовательской странице, что пользователь вошел в систему.
это основное приложение Angular + asp.net, и аутентификация работала хорошо, на угловых страницах вы можете видеть, что пользователь вошел в систему. Теперь вы создаете пользовательскую страницу cshtml, вы также хотите просмотреть текущую информацию о пользователе, но вы обнаружили что в меню вы можете видеть только кнопку Login, которая вместо этого должна отображать имя пользователя, поскольку пользователь уже вошел в систему, я прав? Если да, то, возможно, для устранения неполадок потребуется минимальный воспроизводимый образец...
@TinyWang, верно. И я создал минимальный воспроизводимый образец, см. файлы cshtml и cs в заданном выше вопросе. Меньше кода быть не может. Но даже в этом случае... Я не могу получить идентификатор пользователя на своей странице. Проблема не в том, что его нет в роли администратора, проблема в том, что он не аутентифицирован.
да, но я не могу воспроизвести проблему на своей стороне с помощью кодов, которыми вы поделились в вопросе...
Итак, ваша страница может получить информацию о входе пользователя?
нет, я не могу создать образец для тестирования только с вашими фрагментами кода. Как вы создаете свой проект и как добавляете механизм аутентификации?
Я использую стандартный OOB angular. Net основной проект в Visual Studio.
@TinyWang: см. последнее редактирование. Я смог увидеть информацию о пользователе, но только когда поместил страницу бритвы в конкретную папку. Не уверен, какая «настройка» это делает.





Добавьте [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- источник
Итак, я нашел два похожих поста на 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")]
И это было все!
Извините, но я не могу понять вашу проблему. Не могли бы вы поделиться, чего вы хотите достичь?