Конвертированные пользователи вышли из системы через 30 минут - PullRequest
0 голосов
/ 02 мая 2020

Я только что взял. net Framework-приложение и преобразовал его в. net Core. При импорте данных из старой таблицы пользователей метка SecurityStamp выполнялась в нижнем регистре, например, «0e124deb-8392-4d cc -bce7-38dcc48569a2». Когда пользователь меняет свой пароль, он получает новый SecurfityStamp. Теперь они в верхнем регистре, например, «WHBXXXSQEIDVA7KF3T6AJJJ3AHWWUSYE».

У пользователей с новым SecurityStamp проблем нет. Должен ли я просто стереть столбец SecurityStamp в пользовательской таблице? Существует ли новый SecurityStamp, созданный при следующем входе пользователя? Мне было трудно найти документацию по идентичности на этом уровне.

1 Ответ

1 голос
/ 02 мая 2020

Новый штамп безопасности создается только в том случае, если пользователь меняет свой пароль или отменяет связь с внешним логином. Повар ie по умолчанию проверяется через интервал 30 минут. поскольку вы используете самую последнюю версию. net -core, вы можете использовать следующий фрагмент кода в ConfigureServices() в startup.cs, чтобы продлить время проверки.

Если время установлено на 0, оно будет проверяться при каждом запросе


services.Configure<SecurityStampValidatorOptions>(options =>
{
    // This is the key to control how often validation takes place
    options.ValidationInterval = TimeSpan.FromMinutes(30);
});

Примечание : UserManager позволяет обновить марку безопасности с использованием метода userManager.UpdateSecurityStampAsync(user). если вы используете это после входа в систему, проверка вероятности не удастся.

Наконец, если вы хотите обрабатывать это поведение по-своему, вы можете написать свой собственный валидатор и связку в промежуточном программном обеспечении


services.AddAuthentication(options =>
{
  options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(options =>
 {
    options.Events.OnValidatePrincipal = LastChangedValidator.ValidateAsync;
 });


public static class LastChangedValidator
{
    public static async Task ValidateAsync(CookieValidatePrincipalContext context)
    {
       // you can use your own logic 

       /* var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>();
        var userPrincipal = context.Principal;

        // Look for the last changed claim.
        string lastChanged;
        lastChanged = (from c in userPrincipal.Claims
                       where c.Type == "LastUpdated"
                       select c.Value).FirstOrDefault();

        if (string.IsNullOrEmpty(lastChanged) ||
            !userRepository.ValidateLastChanged(userPrincipal, lastChanged))
        {
            context.RejectPrincipal();
            await context.HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance");
        } */
    }
}

Или вы можете обработать ValidatePrincipal() переопределив метод с помощью следующего


public class CustomCookieHandler: CookieAuthenticationEvents
{
  public override Task ValidatePrincipal(CookieValidatePrincipalContext context)
  {
    return base.ValidatePrincipal(context);
  }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...