如何在 asp.net 控制器中获取用户身份?

Posted

技术标签:

【中文标题】如何在 asp.net 控制器中获取用户身份?【英文标题】:How to get user identity inside asp.net controller? 【发布时间】:2021-05-02 07:57:57 【问题描述】:

仅供参考:我已经看过这个答案,但答案无效 => How do I get current user in .NET Core Web API (from JWT Token)

场景: 我有一个 ASP.net 5 Web API,几天前我从 ASP.net core 3.1 迁移了它。 我在后端设置了 JWT 身份验证。令牌发行工作正常。当我解码令牌时,每个声明都在那里。 我的前端调用后端中的端点。在控制器的这个端点内,我需要知道用户是谁。所以我想接收来自 JWT 令牌的声明。 如上所述,我已经尝试了上述几乎所有的解决方案,但都没有奏效。 所以我的问题是,控制器内的用户没有声明。

我目前的进度: 在 startup.cs 类中,我注册了 HttpContextAccessor。

public void ConfigureServices(IServiceCollection services)

    services.AddHttpContextAccessor();
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    ...

控制器:

namespace ...

    [Route("api/[controller]")]
    [ApiController]
    public class UserController : ControllerBase
    
        private readonly IConfiguration _config;
        private readonly IUserService _userService;
        private readonly IHttpContextAccessor _httpContextAccessor;

    public UserController(IConfiguration config, IUserService userService, IHttpContextAccessor httpContextAccessor)
    
        _config = config;
        _userService = userService;
        _httpContextAccessor = httpContextAccessor;
    

    [HttpGet("currentUser")]
    public IActionResult GetCurrentUser()
    
        var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
        return Ok(userId);
    

调用此端点后,我收到以下错误: System.NullReferenceException:“对象引用未设置为对象的实例。” 我猜依赖注入应该没问题。

User 内部的 Claims 属性是空的,所以我真的不知道如何解决这个问题。

【问题讨论】:

您在令牌中看到了哪些声明?哪一个包含您希望检索的值? @mason 我想使用电子邮件。但这不是一成不变的,我很灵活。我的最后一次尝试是使用 Nameidentifier,payload 中的键是“nameid”。 你的 startup.cs 中有.AddOpenIdConnect() 吗?我能够对其进行映射,以便 HttpContext.User.Identity.Name 通过options.TokenValidationParameters = new TokenValidationParameters NameClaimType = "name" ; 从“名称”声明中获取其值,因此如果您将 NameClaimType 设置为“nameid”,它可能会起作用。 我不完全明白你想在哪里调用 AddOpenIdConnect() 方法。 IServiceCollection 和 IApplicationBuilder 没有这个方法? AddOpenIdConnect 将是您在 AuthenticationBuilder 上调用的扩展方法,例如 services.AddAuthentiction().AddOpenIdConnect()。但也许你正在使用不同的库。您应该从 Startup.cs 共享您的相关配置。 AddOpenIdConnect 方法来自Microsoft.AspNetCore.Authentication.OpenIdConnect 库。 【参考方案1】:

你可以试试这个:

         var username = _httpContextAccessor.HttpContext.User.Identity.Name;

关注official document了解更多信息。

【讨论】:

这要求名称声明被成功映射。鉴于他们说 User 属性没有声明,我怀疑它是否已成功映射。 是的@mason 是对的。我没有看到任何索赔。这个我也试过了。

以上是关于如何在 asp.net 控制器中获取用户身份?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP NET CORE 3.0 中获取当前登录的用户 ID?

如何在 Razor 页面中获取 ASP.NET 身份验证票证到期?

使用 ASP.NET 表单身份验证时如何获取当前登录用户的用户 ID?

如何在asp.net中获取windows认证用户的用户名?

如何在 ASP.NET MVC 中获取当前用户

如何在 Asp.net core mvc 的控制器中获取自己的用户