In ASP.NET Core (Versione 2.1) può capitare di non riuscire ad impostare un cookie anche se tutto il codice è corretto e non ci sono segnalazioni di errore.
Questo è dovuto alla presenza delle cookie policy impostate nello Startup.cs:
public class Startup
{
  ...
  public void ConfigureServices(IServiceCollection services)
  {
    ...
    services.Configure<CookiePolicyOptions>(options =>
    {
      // This lambda determines whether user consent for non-essential cookies is needed for a given request.
      options.CheckConsentNeeded = context => true;
      options.MinimumSameSitePolicy = SameSiteMode.None;
    });
   ...
  }
}
in particolare al valore di CheckConsentNeeded.
Questo valore è stato introdotto per soddisfare i requisiti dell GDPR che prevede, tra le altre cose, di dare un informativa all'utente sul trattamento delle informazioni che il sito può raccogliere durante la sua navigazione. Se è impostato su true, prevede che l'utente dia un esplicito consenso ad un avviso mostrato in pagina. Senza questo consenso non viene generato nessun cookie ne emesso nessun errore.

Quindi se non serve raccogliere il consenso, come nel caso di una intranet, si può impostare il suo valore a false:
options.CheckConsentNeeded = context => false;
se serve, ma dobbiamo per forza generare un cookie prima si aver avuto il consenso dell'utente, ad esempio per impostare la lingua, va settata la proprietà IsEssential=true:
string key = "lingua";
string value = "it-IT"
var options = new CookieOptions
{
  IsEssential = true,
  Expires = DateTimeOffset.UtcNow.AddYears(1),
};
Response.Cookies.Append(key, value, options);

Vedi anche Localizzare un applicazione ASP.NET Core.