如何在ASP.NET Core项目的类库中调用FindFirstValue()方法
解决方案
问题根因梳理
- 拼写错误:
ClaimTypes.NameIdentifire拼写错误,正确应为ClaimTypes.NameIdentifier - 缺少扩展方法依赖:
FindFirstValue是ClaimsPrincipal的扩展方法,类库项目默认未引入对应依赖,导致方法无法识别 - 变量重复定义:方法参数已经声明了
int userId,方法内部再次声明同名变量会触发编译错误 - 类型转换不合法:
FindFirstValue返回字符串类型,不能直接强转为int,需要显式转换 - 空引用风险:未判断
_accessor.HttpContext是否为空,非HTTP请求场景下会触发空引用异常
具体修复步骤
第一步:添加ASP.NET Core依赖
两种方案二选一即可:
- 若类库仅需要少量ASP.NET Core接口,在Core类库项目中安装
Microsoft.AspNetCore.Authentication.AbstractionsNuGet包,版本与主项目ASP.NET Core版本匹配。 - 若类库是面向ASP.NET Core的业务类库,直接修改类库的
.csproj文件添加框架引用,自动导入所有ASP.NET Core相关组件:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <!-- 替换为你主项目使用的.NET版本 --> </PropertyGroup> <ItemGroup> <FrameworkReference Include="Microsoft.AspNetCore.App" /> </ItemGroup> </Project>
第二步:修正业务代码
修正拼写、变量冲突、类型转换和空判断问题,参考代码如下:
using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using Toplearn.Core.Services.Interfaces.CheckPermissions; using Toplearn.DataLayer.Entities.Context; namespace Toplearn.Core.Services.Services.CheckPermissions { public class CheckPermissionServices : ICheckPermissionServices { private readonly ToplearnContext _context; private readonly IHttpContextAccessor _accessor; public CheckPermissionServices(ToplearnContext context, IHttpContextAccessor accessor) { _context = context; _accessor = accessor; } // 移除重复的userId参数,仅保留权限ID参数 public bool CheckIsAllowedUser(int givenPermissionId) { // 优先判断HTTP上下文和认证状态,避免空引用 if (_accessor.HttpContext?.User.Identity?.IsAuthenticated != true) return false; // 修正拼写,显式转换字符串类型的用户ID为int var userIdStr = _accessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier); if (!int.TryParse(userIdStr, out int userId)) return false; // 原有业务逻辑保持不变 bool isExistUser = _context.Users.Any(u => u.UserId == userId); if (!isExistUser) return false; bool isExistAnyRole = _context.User_Roles.Any(ur => ur.UserId == userId); if (!isExistAnyRole) return false; List<int> RoleIds = _context.User_Roles.Where(ur => ur.UserId == userId) .Select(r => r.RoleId).ToList(); bool isContainThisPermission = false; foreach (var item in RoleIds) { bool isExist = _context.RolePermissions.Any(rp => rp.RoleId == item && rp.PermissionId == givenPermissionId); if (isExist) { isContainThisPermission = true; break; } } return isContainThisPermission; } } }
第三步:确认主项目配置
确保ASP.NET Core主项目的Program.cs(或Startup.cs)中已经注册了IHttpContextAccessor服务:
// .NET 6+ 写法 builder.Services.AddHttpContextAccessor();
内容的提问来源于stack exchange,提问作者Hossein
相关产品推荐
相关产品推荐

