Почему аутентификация по куки в C# ASP.NET Core 6 MVC не сохраняется на IIS в течение установленного времени? Что может быть причиной этой проблемы?

В режиме разработки авторизация сохраняется на протяжении семи дней, однако при развертывании на сервере Windows Server под IIS 10 она работает всего 20-30 минут, после чего сессия становится недействительной, хотя куки все еще активны. Я подозреваю, что в куках хранится ключ, который используется для проверки на сервере. На форумах не удается найти вменяемого ответа или даже обсуждения этой проблемы. Ранее я самостоятельно создавал и шифровал куки, работая с asp web form, но теперь, с переходом на новую технологию, столкнулся с трудностями и не могу понять, что именно происходит. 

Привожу реализацию от инициализации конфигурации до валидации, надеясь на помощь. 

**Program.cs** 
```csharp
//.....
builder.Services
    .AddAuthentication(BaseProperties.CookieAuthenticationDefaultsScheme)
    .AddCookie(BaseProperties.CookieAuthenticationDefaultsScheme, options =>
    {
        options.Cookie.Name = BaseProperties.CookieName;
        options.ClaimsIssuer = BaseProperties.AppIssuer;
        options.ExpireTimeSpan = TimeSpan.FromDays(BaseProperties.CookieMaxAgeDays);
        options.Cookie.MaxAge = TimeSpan.FromDays(BaseProperties.CookieMaxAgeDays);
        options.SlidingExpiration = true;
        options.LoginPath = "/Login/Index";
        options.LogoutPath = "/Login/Index";
    });
//.....
app.UseAuthentication();
app.UseAuthorization();
```

**Create ClaimsPrincipal** 
```csharp
List<Claim> claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.NameIdentifier, id.ToString(), ClaimValueTypes.Integer));
claims.Add(new Claim("Login", _login));
claims.Add(new Claim("Password", _password));
claims.Add(new Claim(ClaimsIdentity.DefaultI...
```

Буду признателен за любую помощь в решении этой проблемы.
  • 9 сентября 2024 г. 4:53
Ответы на вопрос 1
Проблема с аутентификацией через куки в ASP.NET Core, когда сессия становится недействительной через 20-30 минут на IIS, может быть вызвана несколькими факторами. Ниже приведены возможные причины и рекомендации по их устранению.

### 1. Настройки IIS и App Pool

1. **Idle Timeout**: Убедитесь, что ваш пул приложений не завершает работу из-за настройки *Idle Timeout*. По умолчанию пулам приложений в IIS разрешается простаивать 20 минут, после чего они могут быть завершены. Это может вызвать потерю состояния аутентификации. Чтобы изменить это:

   - Откройте IIS Manager.
   - Найдите ваш пул приложений.
   - Перейдите в "Advanced Settings".
   - Установите значение *Idle Time-out (minutes)* на более длительное время или на 0 (чтобы отключить).
  
2. **Regular Time Interval**: Также, проверьте настройки *Regular Time Interval* в *Recycling*. Если оно настроено на краткие интервалы, это может вызвать периодическую перезагрузку приложения.

### 2. Северные часы и время жизни куки

1. **Время на сервере**: Убедитесь, что время на сервере настроено правильно. Расхождение во времени между клиентом и сервером может вызвать проблемы с аутентификацией.

2. **Время жизни куки**: Вы настроили `ExpireTimeSpan` и `MaxAge`, но стоит проверить, правильно ли это влияет на работу, и убедитесь, что они действительно применяются.

### 3. Хранение ключей для шифрования

Если ваша кука шифруется, проверьте, что ключи шифрования не меняются. Если вы используете временные ключи при каждом запуске приложения, это может означать, что когда ваше приложение перезапускается (что происходит часто на IIS), старые куки не могут быть расшифрованы. Рассмотрите возможность использования:

```csharp
builder.Services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"C:\path\to\keys"))
    .SetApplicationName("YourAppName");
```

### 4. Обработка куки

Убедитесь, что куки не очищаются из-за политики безопасности браузера или DNT (Do Not Track) настроек пользователя.

### 5. Middleware

Убедитесь, что `app.UseAuthentication();` и `app.UseAuthorization();` вызываются в правильном порядке в конвейере (pipeline) обработки запросов. Метод `app.UseRouting();` должен вызываться перед ними.

### 6. Отладка

Используйте логи для отслеживания проблем с аутентификацией. Включите ведение журналов для аутентификации и просмотрите их, чтобы выяснить, что именно происходит, когда сессия становится недействительной.

```csharp
builder.Logging.AddDebug();
builder.Logging.AddConsole();
```

### Заключение

Проверьте все вышеперечисленные пункты. Это должно помочь вам выявить и устранить проблему с сохранением состояния аутентификации на IIS. Если ничего из этого не решает вашу проблему, возможно, стоит рассмотреть применение системного подхода, например, обеспечить кэширование аутентификации через Redis или другой механизм сохранения состояния.
Похожие вопросы