ExpireTimeSpan игнорируется после продолжительности регенерации идентификатора / validateInterval в идентичности MVC (2.0.1)

Обычно я освобождаю каждый выделенный блок, как только я уверен, что с ним все закончится. Сегодня точкой входа моей программы может быть main(int argc, char *argv[]), но завтра это может быть foo_entry_point(char **args, struct foo *f) и введено как указатель функции.

Итак, если это произойдет, у меня теперь есть утечка.

Что касается вашего второго вопроса, если моя программа взяла ввод, например a = 5, я бы выделил место для a или перераспределял одно и то же пространство на следующем a = "foo". Это оставалось бы распределенным до:

  1. Пользователь напечатал «unset a»
  2. . Была введена моя функция очистки, либо обслуживая сигнал, либо пользователь набрал «quit»

Я не могу придумать никакой современной ОС, которая не восстанавливает память после выхода процесса. Опять же, free () дешево, почему бы не убрать? Как говорили другие, такие инструменты, как valgrind, отлично подходят для обнаружения утечек, о которых вам действительно нужно беспокоиться. Несмотря на то, что блоки, на которые вы, например, будете помечены как «все еще доступные», просто лишний шум в выходе, когда вы пытаетесь обеспечить отсутствие утечек.

Еще один миф: « Если его в main (), мне не нужно его освобождать ", это неверно. Рассмотрим следующее:

char *t;

for (i=0; i < 255; i++) {
    t = strdup(foo->name);
    let_strtok_eat_away_at(t);
}

Если это произошло до форкирования / демонтирования (и в теории работает вечно), ваша программа только что пропустила неопределенный размер в 255 раз.

Хорошая, хорошо написанная программа всегда должна очищаться после себя. Освободите всю память, очистите все файлы, закройте все дескрипторы, отсоедините все временные файлы и т. Д. Эта функция очистки должна быть достигнута при обычном завершении или при получении различных видов фатальных сигналов, если вы не захотите оставить некоторые файлы, лежащие вокруг, чтобы вы могли обнаружите сбой и возобновите.

На самом деле, будьте добры к бедной душе, которая должна поддерживать ваши вещи, когда вы переходите к другим вещам .. передайте их им «valgrind clean»:)

29
задан ekad 2 September 2016 в 02:15
поделиться

1 ответ

Когда SecurityStampValidator запускает обратный вызов regenerateIdentity, аутентифицированный в настоящее время пользователь повторно входит в систему с непостоянным логином . Это жестко запрограммировано, и я не верю, что есть какой-то способ напрямую контролировать это. Таким образом, сеанс входа в систему будет продолжаться только до конца сеанса браузера, который вы запускаете в тот момент, когда идентичность восстанавливается.

Вот подход, позволяющий сделать вход в систему постоянным даже при операциях регенерации идентификаторов. Это описание основано на использовании шаблонов веб-проектов Visual Studio MVC ASP.NET.

Во-первых, нам нужен способ отследить тот факт, что сеанс входа в систему является постоянным для отдельных HTTP-запросов. Это можно сделать, добавив утверждение «IsPersistent» к личности пользователя. Следующие методы расширения показывают способ сделать это.

public static class ClaimsIdentityExtensions
{
    private const string PersistentLoginClaimType = "PersistentLogin";

    public static bool GetIsPersistent(this System.Security.Claims.ClaimsIdentity identity)
    {
        return identity.Claims.FirstOrDefault(c => c.Type == PersistentLoginClaimType) != null;
    }

    public static void SetIsPersistent(this System.Security.Claims.ClaimsIdentity identity, bool isPersistent)
    {
        var claim = identity.Claims.FirstOrDefault(c => c.Type == PersistentLoginClaimType);
        if (isPersistent)
        {
            if (claim == null)
            {
                identity.AddClaim(new System.Security.Claims.Claim(PersistentLoginClaimType, Boolean.TrueString));
            }
        }
        else if (claim != null)
        {
            identity.RemoveClaim(claim);
        }
    }
}

Далее нам нужно сделать утверждение «IsPersistent», когда пользователь подписывает запрос на постоянный сеанс. Например, ваш класс ApplicationUser может иметь метод GenerateUserIdentityAsync, который можно обновить, чтобы он принимал параметр флага isPersistent следующим образом, чтобы при необходимости выдвигать такое утверждение:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, bool isPersistent)
{
    var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
    userIdentity.SetIsPersistent(isPersistent);
    return userIdentity;
}

Любые вызывающие из ApplicationUser.GenerateUserIdentityAsync теперь нужно будет передать флаг isPersistent. Например, вызов GenerateUserIdentityAsync в AccountController.SignInAsync изменится с

AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, 
    await user.GenerateUserIdentityAsync(UserManager));

на

AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent },
    await user.GenerateUserIdentityAsync(UserManager, isPersistent));

Наконец, делегат CookieAuthenticationProvider.OnValidateIdentity, используемый в методе Startup.ConfigureAuth, нуждается в некоторое внимание, чтобы сохранить детали персистентности в операциях регенерации идентичности. Делегат по умолчанию выглядит следующим образом:

OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
    validateInterval: TimeSpan.FromMinutes(20),
    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))

Это можно изменить на:

OnValidateIdentity = async (context) =>
{
    await SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromMinutes(20),
        // Note that if identity is regenerated in the same HTTP request as a logoff attempt,
        // the logoff attempt will have no effect and the user will remain logged in.
        // See https://aspnetidentity.codeplex.com/workitem/1962
        regenerateIdentity: (manager, user) =>
            user.GenerateUserIdentityAsync(manager, context.Identity.GetIsPersistent())
    )(context);

    // If identity was regenerated by the stamp validator,
    // AuthenticationResponseGrant.Properties.IsPersistent will default to false, leading
    // to a non-persistent login session. If the validated identity made a claim of being
    // persistent, set the IsPersistent flag to true so the application cookie won't expire
    // at the end of the browser session.
    var newResponseGrant = context.OwinContext.Authentication.AuthenticationResponseGrant;
    if (newResponseGrant != null)
    {
        newResponseGrant.Properties.IsPersistent = context.Identity.GetIsPersistent();
    }
}
36
ответ дан chrisg 2 September 2016 в 02:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: