簡體   English   中英

ASP.NET Core 3.1“‘用戶’不包含‘FindFirstValue’的定義”

[英]ASP.NET Core 3.1 "'User' does not contain a definition for 'FindFirstValue'"

在嘗試從此處執行答案時> 如何在 ASP.NET 核心中獲取當前登錄的用戶 ID,並且用戶將我重定向到此處> https://github.com/dotnet/aspnetcore/issues/18348

var UserId = User.FindFirstValue(ClaimTypes.Name);

^ 這不起作用,並打印以下錯誤'User' does not contain a definition for 'FindFirstValue'

編輯:添加 controller 片段

我的 controller 的完整片段...

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);
        }
    }
}

我的 controller 正在調用的完整片段...

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();
        }
    }
}

知道為什么我會收到此錯誤嗎?

嘗試按如下方式獲取用戶 ID(對於 ClaimsPrincipal 類型的用戶)

 var userId = User.Claims.Where(c => c.Type == "sub").FirstOrDefault().Value;

對於 System.Web.Providers.Entities.User 類型的用戶使用

User.UserId

https://docs.microsoft.com/en-us/previous-versions/aspnet/dn253175(v=vs.108)

好的。 有問題。 User ClaimPrinciple僅在Controller上下文中可用。 我看到您的ControllerNameProcessing不是Controller class。 因此,您應該執行以下操作:

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
     }
}

然后你應該在Startup class 中注冊IHttpContextAccessor如下:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
}

現在在您的 controller 中:

[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);
    }
}

然后你應該在Startup class 中注冊OtherClassNameProcessing如下:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
    services.AddScoped<OtherClassNameProcessing>();
}

您可能遇到的問題是您缺少正確的 package。

安裝這個:Microsoft.Extensions.Identity.Core

然后它應該在包含 using 語句后開始工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM