Аутентификация ограничивает обширный размер заголовка - PullRequest
0 голосов
/ 24 мая 2018

У меня есть приложение Asp .net mvc, которое подключается к серверу идентификации Identity server 4.Когда я выпустил приложение, я был обеспокоен этой ошибкой.

апстрим отправил слишком большой заголовок при чтении заголовка ответа из апстрима

Который я отследил до этого апстрим отправил слишком большой заголовок при чтении заголовка ответа из апстрима

Я не могу изменить конфигурацию, и администратор sys заявил, что нам нужно уменьшить заголовки.

enter image description here

После этого я должен согласиться с тем, что эти заголовки немного широки.

Startup.cs в приложении

services.AddAuthentication(options =>
        {
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        })
        .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
            {

                options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.Authority = Configuration["ServiceSettings:IdentityServerEndpoint"];
                options.RequireHttpsMetadata = true;
                options.ClientId = Configuration["ServiceSettings:ClientId"];
                options.ClientSecret = Configuration["ServiceSettings:secret"];
                options.Scope.Add("testapi");
                options.ResponseType = "code id_token";
                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;
                options.Events = new OpenIdConnectEvents()
                {
                    OnRemoteFailure = ctx =>
                    {
                        _logger.LogCritical($"Remote Faliure: {ctx.Failure}");
                        ctx.HandleResponse();
                        return Task.FromResult(0);
                    }
                };
            });

Я искал повсюду и, похоже, не могу найти способ ограничения размера этого огромного заголовка.

1 Ответ

0 голосов
/ 29 мая 2018

По умолчанию cookie содержит всю соответствующую информацию в зашифрованном виде, поэтому при вызове вашего API все, что вам нужно сделать, это расшифровать cookie и использовать эту информацию.

Однако, часто все хранится в cookieСамо по себе нежелательно, особенно если имеется много актуальной информации.Cookie отправляется с каждым запросом к вашему API, и если он большой - много (одной и той же) информации отправляется туда и обратно в основном бесплатно.Кроме того, как вы сами видите, размер cookie может стать ограничивающим фактором в некоторых средах.

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

Вы можете настроить хранилище для сессии следующим образом:

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(o => o.SessionStore = new MemoryCacheTicketStore());

И пример реализации MemoryCacheTicketStore можно найти на asp.net examples на github:

public class MemoryCacheTicketStore : ITicketStore
{
    private const string KeyPrefix = "AuthSessionStore-";
    private IMemoryCache _cache;

    public MemoryCacheTicketStore()
    {
        _cache = new MemoryCache(new MemoryCacheOptions());
    }

    public async Task<string> StoreAsync(AuthenticationTicket ticket)
    {
        var guid = Guid.NewGuid();
        var key = KeyPrefix + guid.ToString();
        await RenewAsync(key, ticket);
        return key;
    }

    public Task RenewAsync(string key, AuthenticationTicket ticket)
    {
        var options = new MemoryCacheEntryOptions();
        var expiresUtc = ticket.Properties.ExpiresUtc;
        if (expiresUtc.HasValue)
        {
            options.SetAbsoluteExpiration(expiresUtc.Value);
        }
        options.SetSlidingExpiration(TimeSpan.FromHours(1)); // TODO: configurable.

        _cache.Set(key, ticket, options);

        return Task.FromResult(0);
    }

    public Task<AuthenticationTicket> RetrieveAsync(string key)
    {
        AuthenticationTicket ticket;
        _cache.TryGetValue(key, out ticket);
        return Task.FromResult(ticket);
    }

    public Task RemoveAsync(string key)
    {
        _cache.Remove(key);
        return Task.FromResult(0);
    }
}
...