Fid*_*eak 3 .net-core asp.net-core asp.net-core-identity .net-core-3.1
在尝试从此处实现答案时>如何在 ASP.NET Core 中获取当前登录的用户 Id 以及用户将我重定向到此处> https://github.com/dotnet/aspnetcore/issues/18348
var UserId = User.FindFirstValue(ClaimTypes.Name);
^ 这不起作用,并打印以下错误'User' does not contain a definition for 'FindFirstValue'
编辑:添加控制器片段
我的控制器的完整片段...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using ProjectName.Processing;
using ProjectName.Repository;
using Newtonsoft.Json;
namespace ProjectName.Controllers
{
    [ApiController]
    [Route("api/[controller]/[action]")]
    public class ClassNameController : ControllerBase
    {
        private readonly ILogger<ClassNameController> _logger;
        private OtherClassNameProcessing proc = new OtherClassNameProcessing();
        public ClassNameController(ILogger<ClassNameController> logger)
        {
            _logger = logger;
        }
        [HttpGet]
        [ProducesResponseType(typeof(List<2ndOtherClassNameRepository>), StatusCodes.Status200OK)]
        public IActionResult GetUserName()
        {
            var data = proc.GetUserName();
            return Ok(data.Result);
        }
    }
}
我的控制器正在调用的完整片段...
using Microsoft.EntityFrameworkCore;
using ProjectName.Data;
using ProjectName.Repo;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//using System.Web;
using System.Threading.Tasks;
using System.Security.Claims;
using Microsoft.AspNetCore.Http;
using System.Web.Providers.Entities;
namespace ProjectName.Processing
{
    public class OtherClassNameProcessing
    {
        private readonly ProjName_DevelContext _context = new ProjName_DevelContext();
        private async Task<List<2ndOtherClassNameRepository>> GetNameFromRepo()
        {
            List<2ndOtherClassNameRepository> repoList = new List<2ndOtherClassNameRepository>();
            var Temp = await _context.tablename.ToListAsync();
            /* Working Test
            2ndOtherClassNameRepository repo = new 2ndOtherClassNameRepository();
            repo.UserName = "JohnDoe";
            repoList.Add(repo);
            return repoList;
            */
            2ndOtherClassNameRepository repo = new 2ndOtherClassNameRepository();
            // repo.UserName = "JohnDoe";
            var userId = User.FindFirstValue(ClaimTypes.Name);
            repo.UserName = userId;
            repoList.Add(repo);
            return repoList;
        }
        internal async Task<List<2ndOtherClassNameRepository>> GetUserName()
        {
            return await GetNameFromRepo();
        }
    }
}
知道为什么我会收到此错误吗?
好的!遇到问题了。User ClaimPrinciple仅在上下文中可用Controller。我发现你ControllerNameProcessing不是一个Controller班级。所以你应该这样做:
public class ControllerNameProcessing
{
     private readonly IHttpContextAccessor _httpContextAccessor;
     public ControllerNameProcessing(IHttpContextAccessor httpContextAccessor)
     {
         _httpContextAccessor = httpContextAccessor;
     }
     private async Task<List<2ndClassNameRepository>> GetNameFromRepo()
     {
         // Omitted your other codes for brevity
         var userName = _httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.Name);
        // Omitted your other codes for brevity
     }
}
然后您应该按如下方式IHttpContextAccessor在班级中注册:Startup
public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
}
现在在你的控制器中:
[ApiController]
[Route("api/[controller]/[action]")]
public class ClassNameController : ControllerBase
{
    private readonly ILogger<ClassNameController> _logger;
    private OtherClassNameProcessing _otherClassNameProcessing;
    public ClassNameController(ILogger<ClassNameController> logger, OtherClassNameProcessing otherClassNameProcessing)
    {
        _logger = logger;
        _otherClassNameProcessing = otherClassNameProcessing;
    }
    [HttpGet]
    [ProducesResponseType(typeof(List<2ndOtherClassNameRepository>), StatusCodes.Status200OK)]
    public IActionResult GetUserName()
    {
        var data = proc.GetUserName();
        return Ok(data.Result);
    }
}
然后您应该按如下方式OtherClassNameProcessing在班级中注册:Startup
public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
    services.AddScoped<OtherClassNameProcessing>();
}
| 归档时间: | 
 | 
| 查看次数: | 7177 次 | 
| 最近记录: |