Asp.net-Core-Webapi

Asp.NET Core 2.0 API 控制器中的 User.Identity.Name 為空

  • October 14, 2021

我是 ASP.NET 核心本身的新手。但是,我在 ASP.NET Core 2.0 中創建 WebAPI。我已經配置了基於 JWT Bearer Token 的身份驗證。下面是我的控制器,它返回令牌。

   [AllowAnonymous]
[Route("api/[controller]")]
public class TokenController : Controller
{
   private readonly UserManager<UserEntity> userManager;
   private readonly SignInManager<UserEntity> signInManager;

   public TokenController(UserManager<UserEntity> userManager, SignInManager<UserEntity> signInManager)
   {
       this.userManager = userManager;
       this.signInManager = signInManager;
   }

   // GET: api/values
   [HttpGet]
   public async Task<IActionResult> Get(string username, string password, string grant_type)
   {
       {
           var user = await userManager.FindByEmailAsync(username);

           if (user != null)
           {
               var result =await signInManager.CheckPasswordSignInAsync(user, password, false);
               if (result.Succeeded)
               {

                   var claims = new[]
                   {
                       new Claim( JwtRegisteredClaimNames.Sub, username),
                       new Claim( JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                       new Claim( JwtRegisteredClaimNames.GivenName, "SomeUserID")
                   };

                   var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("secretesecretesecretesecretesecretesecrete"));
                   var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

                   var token = new JwtSecurityToken( issuer: "test",
                                                    audience: "test",
                                                    claims: claims,
                                                     expires: DateTime.Now.AddDays(15),
                                                     signingCredentials: creds);

                   return Ok(new { access_token = new JwtSecurityTokenHandler().WriteToken(token), expires_on=DateTime.Now.AddDays(15) });

               }
           }
       }

       return BadRequest("Could not create token");
   }


}

但是當呼叫裝飾有 ValuesController API 時**$$ Authorize $$**屬性。我得到 User.Identity.Name為空。我沒有得到任何關於使用者的資訊。我不確定,我的令牌控制器是否正確編寫。只要它保護我的 ValuesController,我認為它是正確的。但是,我可能會遺漏一些東西。請幫忙。

注意:我正在使用 Visual Studio 2017 和 Mac 社區添加進行開發

使用“DefaultIdentity”(個人使用者帳戶)也有這個問題(Core 3.1)。User.Identity.Name 為空,User.Identity.IsAuthenticated = true。通過使用 httpContextAccessor,您可以獲得帶有該 ID 的 userId,您可以找到使用者和 UserName。在您的控制器中添加

using System.Security.Claims;
...
private readonly IHttpContextAccessor _httpContextAccessor;
public MyController(MyContext context, IHttpContextAccessor httpContextAccessor)
{
 _context = context;
 _httpContextAccessor = httpContextAccessor;
}

// Any method username needed
[HttpGet("{id}")]
public async Task<ActionResult<MyInfo>> GetMyInfo(int id)
{
 var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
 var user = _context.AspNetUsers.Find(userId);
 var userName = user.UserName;
 ...
}

在 Startup.cs 添加以下行:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

我在 ASP.Net Core 2 上也遇到過這個問題,我真的很驚訝沒有人發現這個問題的其他原因。

當我的 webapp 部署到 IIS 時,“ User.Identity.Name”總是返回 null。IIS 站點禁用了匿名訪問,並啟用了 Windows 身份驗證。

但。

我沒有意識到我的 ASP.Net Core 2 有一個 " launchSettings.json" 文件,悄悄地隱藏在Properties文件夾下,其中還有一些 iisSettings,而這裡的 " windowsAuthentication" 奇怪的是,預設設置為 false。

在此處輸入圖像描述

將“”更改windowsAuthentication為true,將“”更改anonymousAuthentication為false為我解決了這個問題。

這樣做之後,“ User.Identity.Name”最終確實包含了正確的使用者名。

但是這個設置到底是什麼?為什麼會優先於我們在 IIS 管理器中設置的實際設置?!

引用自:https://stackoverflow.com/questions/46820767