ASP.NET Core 3.1“'User' 不包含 'FindFirstValue' 的定义”
ASP.NET Core 3.1 "'User' does not contain a definition for 'FindFirstValue'"
在尝试实现此处的答案时 >
然后用户将我重定向到这里 > 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();
}
}
}
知道我为什么会收到此错误吗?
尝试如下获取用户 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();
}
现在在您的控制器中:
[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>();
}
您可能遇到的问题是缺少合适的软件包。
安装这个:Microsoft.Extensions.Identity.Core
然后它应该在包含 using 语句后开始工作。
在尝试实现此处的答案时 >
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();
}
}
}
知道我为什么会收到此错误吗?
尝试如下获取用户 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();
}
现在在您的控制器中:
[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>();
}
您可能遇到的问题是缺少合适的软件包。
安装这个:Microsoft.Extensions.Identity.Core
然后它应该在包含 using 语句后开始工作。