【问题标题】:How to get current userId in asp.net core如何在asp.net核心中获取当前用户ID
【发布时间】:2022-09-24 16:27:19
【问题描述】:

我在核心中使用身份。

在启动中。

services.AddSingleton<ICurrentUserService, CurrentUserService>();
services.AddHttpContextAccessor();

在 accountcontroller 中

[ApiController]
[Route(\"api/[controller]\")]
public class AccountController : Controller
{
    private readonly IApplicationUserManager _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;

    public AccountController
    (IApplicationUserManager userManager,
        SignInManager<ApplicationUser> signInManager)
    {
        _userManager = userManager;
        //_roleManager = roleManager;
        _signInManager = signInManager;
    }



    [HttpPost(\"Login\")]
    [AllowAnonymous]
    public async Task<IActionResult> Login(LoginViewModel model)
    {
        try
        {
            await _signInManager.SignOutAsync();

            var result = await _signInManager.PasswordSignInAsync(model.email, model.password, true, false);


            if (result.Succeeded)
            {
                return Json(new { success = true});
            }

            var message = string.Join(\"; \", ModelState.Values
                .SelectMany(x => x.Errors)
                .Select(x => x.ErrorMessage));

            return Json(new
            {
                success = false,
                Message = message
            });

        }
        catch (Exception e)
        {
            return Json(new
            {
                success = false,
                Message = e.Message
            });
        }

    }

    [HttpPost(\"logout\")]
    public IActionResult LogOut()
    {
        try
        {
            _signInManager.SignOutAsync();
            return Ok(new { success = true });
        }
        catch (Exception e)
        {
            return Ok(new { success = false, Message = e.Message });
        }

    }
}

}

并在 CurrentUserService

public class CurrentUserService : ICurrentUserService
{
private readonly IHttpContextAccessor _httpContextAccessor;

public CurrentUserService(IHttpContextAccessor httpContextAccessor)
{
    _httpContextAccessor = httpContextAccessor;
}

public Guid? UserId => Guid.Parse(_httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier) ?? string.Empty);


public string FullName => _httpContextAccessor.HttpContext?.User?.FindFirstValue(\"FullName\") != null
                ? _httpContextAccessor.HttpContext?.User?.FindFirstValue(\"FullName\")
                : _httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.Name);

public string Avatar => _httpContextAccessor.HttpContext?.User?.FindFirstValue(\"Avatar\") != null
    ? _httpContextAccessor.HttpContext?.User?.FindFirstValue(\"Avatar\")
    : \"/Themes/img/no_avatar.png\";

}

但_httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier) 始终为空

  • 准确显示您请求它们的位置,它为空,也将 controller 和 startup.cs 或 program.cs 文件代码
  • _httpContextAccessor.HttpContext?.User?.Identity.IsAuthenticated 返回什么?
  • @DimitrisMaragkos 这是错误的
  • 您是否将[Authorize] 属性添加到您正在调用的Controller?
  • 请看新版

标签: asp.net-core .net-core asp.net-identity


【解决方案1】:

如果您想访问 DbContext 类中的 IHttpContextAccessor 及其覆盖的 SavingChanges 方法,请不要这样做!而是创建一个SaveChangesInterceptor,然后像往常一样注入您的服务:

public class AuditableEntitiesInterceptor : SaveChangesInterceptor
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly ILogger<AuditableEntitiesInterceptor> _logger;

    public AuditableEntitiesInterceptor(
        IHttpContextAccessor httpContextAccessor,
        ILogger<AuditableEntitiesInterceptor> logger)
    {
        _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
        _logger = logger ?? throw new ArgumentNullException(nameof(logger));
    }

然后你应该注册你的新拦截器:

services.AddSingleton<AuditableEntitiesInterceptor>();

最后以这种方式将它添加/引入到 EF-Core:

services.AddDbContextPool<ApplicationDbContext>((serviceProvider, optionsBuilder) => 
optionsBuilder.AddInterceptors(serviceProvider.GetRequiredService<AuditableEntitiesInterceptor>());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 2018-11-11
    • 2012-10-20
    • 2015-08-22
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    相关资源
    最近更新 更多