Что такое. NET Core делает со значением Key, возвращенным моей пользовательской реализацией ITicketStore, до того, как оно отправлено в браузер? - PullRequest
0 голосов
/ 24 марта 2020

Я реализовал свою собственную реализацию ITicketStore в. NET Ядро, которое обрабатывает сохранение файлов cookie сеанса в базе данных redis. Мои ключи представляют собой простой guid:

    public async Task<string> StoreAsync(AuthenticationTicket ticket)
    {
        var log = new StringWriter();
        var guid = Guid.NewGuid();
        var key = "MyCustomCache"+ guid.ToString();
        await RenewAsync(key, ticket);
        return key;
    }
    public Task RenewAsync(string key, AuthenticationTicket ticket)
    {
        var options = new DistributedCacheEntryOptions();
        var expiresUtc = ticket.Properties.ExpiresUtc;
        if (expiresUtc.HasValue)
        {
            options.SetAbsoluteExpiration(expiresUtc.Value);
        }
        byte[] val = SerializeToBytes(ticket);
        _cache.Set(key, val, options);
        return Task.FromResult(0);
    }

Однако в браузере, когда я проверяю значение cook ie, оно кажется каким-то образом закодировано / зашифровано (вместо сгенерированного мной guid):

screenshot of guid

Когда повар ie передается в мое приложение, я замечаю, что оно преобразовано обратно в исходное значение, которое я создал в StoreAsyn c:

public Task<AuthenticationTicket> RetrieveAsync(string key)
{
    // Key passed in here will not be the value in the image above. Instead it will be what was 
    // generated in StoreAsync
    AuthenticationTicket ticket;
    byte[] bytes = null;
    bytes = _cache.Get(key);
    ticket = DeserializeFromBytes(bytes);
    return Task.FromResult(ticket);
}

Что именно. NET Ядро делает с моими ключами шифровать / кодировать ключ? Повлияет ли это на мою способность балансировать нагрузку в моем приложении? Я знаю, что в механизме хранения сеансов по умолчанию. NET Ядро шифрует куки-файлы сеансов с помощью ключа c для каждой машины.

1 Ответ

0 голосов
/ 05 мая 2020

Повар аутентификации ie шифруется с защитой данных по умолчанию.

Здесь ключ добавляется к повару ie ( источник ):

if (Options.SessionStore != null)
{
    if (_sessionKey != null)
    {
        await Options.SessionStore.RemoveAsync(_sessionKey);
    }
    _sessionKey = await Options.SessionStore.StoreAsync(ticket);
    var principal = new ClaimsPrincipal(
        new ClaimsIdentity(
            new[] { new Claim(SessionIdClaim, _sessionKey, ClaimValueTypes.String, Options.ClaimsIssuer) },
            Options.ClaimsIssuer));
    ticket = new AuthenticationTicket(principal, null, Scheme.Name);
}

var cookieValue = Options.TicketDataFormat.Protect(ticket, GetTlsTokenBinding());

При переключении в SessionStore ключ сеанса просто добавляется как утверждение, а затем повар ie защищается.

...