Asp.NET Core 2.0 API 控制器中的 User.Identity.Name 為空
我是 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 管理器中設置的實際設置?!
