Я добавляю претензии к идентификатору принципала претензий и регистрирую пользователя. При последующих запросах добавленные претензии доступны в принципале претензий в любом месте приложения, но только в течение 25 минут. Я не проверял от 25 до 30 минут. Через 30 минут идентификационный номер основного требования все еще аутентифицируется , но имеет только утверждения из базы данных идентификационных данных. «CookieClaim», добавленный при входе в систему, отсутствует. Основной идентификатор претензий "IsAuthenticated" по-прежнему остается верным, а приветствие в меню навигации и т. Д. c все еще говорит "Привет адрес электронной почты". Не имеет значения, если мы сделаем запрос в 20 минут.
Я хочу, чтобы эти заявки были доступны, пока пользователь вошел в систему.
Приложение использует OAuth для получения токенов доступа и другая информация для пользователей от нескольких внешних поставщиков, эта информация используется для авторизации во всем приложении. Я решил поместить информацию в претензии в cook ie, потому что она может регулярно меняться и не подходит для хранения в базе данных Identity.
Следующий код взят из скаффолда LoginModel из asp. net ядро 2.2 приложения, которое я сделал для демонстрации. Это не совсем то же самое, что и мое основное приложение, но добавляет претензию, набирает «CookieClaim» и выполняет вход теми же методами. Четыре строки, начинающиеся с «IdentityUser user ...», являются буквально единственными изменениями, которые я внес в базовое веб-приложение шаблона asp. net (с учетными записями локальных пользователей, после создания леса на странице «Логин»)
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
IdentityUser user = await _signInManager.UserManager.FindByEmailAsync(Input.Email);
ClaimsPrincipal currentUser = await _signInManager.CreateUserPrincipalAsync(user);
currentUser.Identities.ElementAt(0).AddClaim(new Claim("CookieClaim", "I am in the Cookie"));
await HttpContext.SignInAsync(IdentityConstants.ApplicationScheme, currentUser, new AuthenticationProperties());
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
В базе данных Identity для этого приложения я добавил заявку для пользователя, типа «IdentityDatabaseClaim». На этом изображении показаны претензии Принципала претензий после входа в систему. Это не изменится ни для одного запроса в течение первых 25 минут:
После 30 минут, претензия из базы данных все еще существует, но тип претензии "CookieClaim", который был отправлен поваром ie при входе в систему, отсутствует, как на этом снимке экрана:
Обратите внимание, что IsAuthenticated по-прежнему актуален для основного удостоверения утверждений. На данный момент все утверждения из базы данных удостоверений имеются.
Я попытался установить ExpireTimeSpan для повара ie в Startup.cs, но это не имеет никакого эффекта. Я почти уверен, что эта проблема не истекает cook ie, иначе пользователь все равно не сможет пройти аутентификацию. Я также попытался установить IsPersistent, IssuedUt c и ExpiresUt c в свойствах аутентификации, в основном, чтобы никому не пришлось предлагать их в качестве ответов на этот вопрос. Ничто не имело никакого значения.
Мне нужно знать, какой метод или параметр заставляет HttpContext (казалось бы) игнорировать данные в запросе cook ie и создавать нового принципала утверждений из базы данных идентификации, и могу ли я может а) выключить его или б) поймать его работающим, чтобы я мог сохранить заявки до того, как он их удалит, и присоединить их снова, прежде чем он попытается пройти через следующий фильтр авторизации.