title: UseJwtBearerAuthentication does not get User.Identity.Name populated
body: <p>I am trying to use <code>JWT</code> for authentication mechanism in <code>ASP.NET Core Web API</code> project. Suppose this project has not <code>MVC</code> part and does not use cookie authentication. I have created my code based on <a href="https://goblincoding.com/2016/07/03/issuing-and-authenticating-jwt-tokens-in-asp-net-core-webapi-part-i/" rel="noreferrer">this guide</a>. </p>
  
  <p>Login works good and protection with <code>[Authorize]</code> attribute works ok but <code>User.Identity.Name</code> is <code>null</code>. How can I fix this?</p>
  
  <p>My code:</p>
  
  <pre><code>public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
  {
      var jwtAppSettingOptions = Configuration.GetSection(nameof(JwtIssuerOptions));
      var tokenValidationParameters = new TokenValidationParameters
      {
          ValidateIssuer = true,
          ValidIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)],
  
          ValidateAudience = true,
          ValidAudience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)],
  
          ValidateIssuerSigningKey = true,
          IssuerSigningKey = _signingKey,
  
          RequireExpirationTime = true,
          ValidateLifetime = true,
  
          ClockSkew = TimeSpan.Zero
      };
  
      app.UseJwtBearerAuthentication(new JwtBearerOptions
      {
          AutomaticAuthenticate = true,
          AutomaticChallenge = true,
          TokenValidationParameters = tokenValidationParameters,
          AuthenticationScheme = JwtBearerDefaults.AuthenticationScheme
      });
  
      app.UseMvc(routes =&gt;
      {
          routes.MapRoute(
              name: "default",
              template: "{controller=Home}/{action=Index}/{id?}");
      });
  }
  </code></pre>
  
  <hr>
  
  <pre><code>    [HttpPost]
      [AllowAnonymous]
      [Route("Login")]
      public async Task&lt;IActionResult&gt; Login([FromForm] ApplicationUser applicationUser)
      {
          //assume user/pass are checked and are ok
  
          _logger.LogInformation(1, "API User logged in.");
          var user = await _userManager.FindByNameAsync(applicationUser.UserName);
          var roles = await _userManager.GetRolesAsync(user);
  
          var claims = new List&lt;Claim&gt;
          {
              new Claim(JwtRegisteredClaimNames.Sub, applicationUser.UserName),
              new Claim(ClaimTypes.NameIdentifier, applicationUser.UserName),
              new Claim(JwtRegisteredClaimNames.Jti, await _jwtOptions.JtiGenerator()),
              new Claim(JwtRegisteredClaimNames.Iat,
                      ToUnixEpochDate(_jwtOptions.IssuedAt).ToString(),
                      ClaimValueTypes.Integer64),
                      new Claim("Claim", "Value")
          };
  
          if (roles != null)
              foreach (var role in roles)
                  claims.Add(new Claim("role", role));
  
          // Create the JWT security token and encode it.
          var jwt = new JwtSecurityToken(
              issuer: _jwtOptions.Issuer,
              audience: _jwtOptions.Audience,
              claims: claims,
              notBefore: _jwtOptions.NotBefore,
              expires: _jwtOptions.Expiration,
              signingCredentials: _jwtOptions.SigningCredentials);
  
          var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);
  
          // Serialize and return the response
          var response = new
          {
              access_token = encodedJwt,
              expires_in = (int)_jwtOptions.ValidFor.TotalSeconds
          };
  
          var json = JsonConvert.SerializeObject(response, _serializerSettings);
          return new OkObjectResult(json);
      }
  </code></pre>