Custom Block Class with custom Template, cache issue
The problem is not your choice of cache parameters. If you set cache max-age to 0 you don't need any other cache setting to disable the cache.

The problem is how you use the block template. You probably render only the single variables you've added and not the default {{ content }} variable. This is the reason the cache info gets lost.

Better use a custom twig template for the custom variables:

hook_theme() in mymodule.module:

function mymodule_theme($existing, $type, $theme, $path) {
  return [
    'mytemplate' =&gt; [
      'variables' =&gt; [
        'var1' =&gt; NULL,
        'var2' =&gt; NULL,
      ],
    ],
  ];
}


build() in block class:

  public function build() {

    $user = \Drupal\user\Entity\User::load(\Drupal::currentUser()-&gt;id());
    $var1 = $user-&gt;field_field1-&gt;value;
    $var2 = $user-&gt;field_field2-&gt;value;

    return [
      '#theme' =&gt; 'mytemplate',
      '#var1' =&gt; $var1,
      '#var2' =&gt; $var2,
      '#cache' =&gt; [
        'contexts' =&gt;  ['user'],
        'tags' =&gt; $user-&gt;getCacheTags(),
      ],
    ];
  };


mytemplate.html.twig:

&lt;h2&gt;Additional user info&lt;/h2&gt;
&lt;p&gt;Field 1: {{ var1 }}&lt;/p&gt;
&lt;p&gt;Field 2: {{ var2 }}&lt;/p&gt;


The template mytemplate will be nested inside of the block template, which then, if you change it back to default, can merge the cache data to the block level and page elements on higher levels.