IdentityServer3 idsrv.partial cookie становится слишком большим - PullRequest
0 голосов
/ 01 июня 2018

После входа в систему при перенаправлении пользователя с помощью context.AuthenticateResult = new AuthenticateResult(<destination>, subject, name, claims) частичный файл cookie становится настолько большим, что в нем содержится до 4 фрагментов, и в итоге вызывает ошибку «запрос слишком большой».

Количество заявок не является возмутительным(в диапазоне 100), и я не смог последовательно воспроизвести это в других средах, даже с большим количеством претензий.Что еще может повлиять на размер этих файлов cookie?

Запуск IdSrv3 2.6.1

1 Ответ

0 голосов
/ 04 июня 2018

Я предполагаю, что вы используете некоторые клиенты .NET Framework, потому что все эти проблемы обычно связаны с промежуточным программным обеспечением Microsoft.Owin, которое имеет некоторое шифрование, которое приводит к тому, что файл cookie становится таким большим.

Решение для вас снова является частью этого промежуточного программного обеспечения.Все ваши клиенты (использующие Identity Server в качестве авторизатора) должны иметь пользовательскую IAuthenticationSessionStore имплементацию.

Это интерфейс, часть Microsoft.Owin.Security.Cookies.

Вам необходимо реализовать егов зависимости от того, какое хранилище вы хотите использовать для него, но в основном оно имеет следующую структуру:

public interface IAuthenticationSessionStore
{
    Task RemoveAsync(string key);
    Task RenewAsync(string key, AuthenticationTicket ticket);
    Task<AuthenticationTicket> RetrieveAsync(string key);
    Task<string> StoreAsync(AuthenticationTicket ticket);
}

В итоге мы создали хранилище SQL Server для файлов cookie.Вот некоторый пример для Реализация Redis , а вот еще один с EF DbContext , но не чувствуйте себя вынужденным использовать любой из них.

Допустим, чтовы реализуете MyAuthenticationSessionStore : IAuthenticationSessionStore со всеми необходимыми ему значениями.

Затем в вашем Owin Startup.cs при вызове:

app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "Cookies",
            SessionStore = new MyAuthenticationSessionStore()
            CookieName = cookieName
        });

Таким образом, как документация для свойства IAuthenticationSessionStore SessionStoreговорит:

// Необязательный контейнер для хранения идентификатора между запросами.При использовании // клиенту отправляется только идентификатор сеанса.Это может быть использовано для уменьшения // потенциальных проблем с очень большими идентификаторами.

В вашем заголовке у вас будет только идентификатор сеанса, а сам идентификатор будет считан из реализованного вами хранилища.

...