Дополнительные претензии отсутствуют в asp. net основной идентификации через 30 минут - PullRequest
0 голосов
/ 27 февраля 2020

Я добавляю претензии к идентификатору принципала претензий и регистрирую пользователя. При последующих запросах добавленные претензии доступны в принципале претензий в любом месте приложения, но только в течение 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 минут:

Claims after logging in, all correct

После 30 минут, претензия из базы данных все еще существует, но тип претензии "CookieClaim", который был отправлен поваром ie при входе в систему, отсутствует, как на этом снимке экрана:

enter image description here

Обратите внимание, что IsAuthenticated по-прежнему актуален для основного удостоверения утверждений. На данный момент все утверждения из базы данных удостоверений имеются.

Я попытался установить ExpireTimeSpan для повара ie в Startup.cs, но это не имеет никакого эффекта. Я почти уверен, что эта проблема не истекает cook ie, иначе пользователь все равно не сможет пройти аутентификацию. Я также попытался установить IsPersistent, IssuedUt c и ExpiresUt c в свойствах аутентификации, в основном, чтобы никому не пришлось предлагать их в качестве ответов на этот вопрос. Ничто не имело никакого значения.

Мне нужно знать, какой метод или параметр заставляет HttpContext (казалось бы) игнорировать данные в запросе cook ie и создавать нового принципала утверждений из базы данных идентификации, и могу ли я может а) выключить его или б) поймать его работающим, чтобы я мог сохранить заявки до того, как он их удалит, и присоединить их снова, прежде чем он попытается пройти через следующий фильтр авторизации.

1 Ответ

0 голосов
/ 29 февраля 2020

Поведение возникает только тогда, когда мы выполняем вход по схеме Application.Identity (IdentityConstants.ApplicationScheme.). Для входа в систему используется другая схема, и любые утверждения, которые вы добавляете к этому идентификатору, будут действовать до тех пор, пока повар ie , Так в ConfigureServices в Startup.cs:

services.AddAuthentication()
    .AddCookie("CustomClaimsCookie")

Затем при входе в метод OnGetCallbackAsyn c (),

ExternalLoginInfo info = await _signInManager.GetExternalLoginInfoAsync();
AuthenticationProperties props = new AuthenticationProperties();
props.StoreTokens(info.AuthenticationTokens);
await HttpContext.SignInAsync("CustomClaimsCookie", info.Principal, props);
...