You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET Core项目的类库中调用FindFirstValue()方法

解决方案

问题根因梳理

  • 拼写错误:ClaimTypes.NameIdentifire 拼写错误,正确应为 ClaimTypes.NameIdentifier
  • 缺少扩展方法依赖:FindFirstValue 是 ClaimsPrincipal 的扩展方法,类库项目默认未引入对应依赖,导致方法无法识别
  • 变量重复定义:方法参数已经声明了int userId,方法内部再次声明同名变量会触发编译错误
  • 类型转换不合法:FindFirstValue 返回字符串类型,不能直接强转为int,需要显式转换
  • 空引用风险:未判断_accessor.HttpContext是否为空,非HTTP请求场景下会触发空引用异常

具体修复步骤

第一步:添加ASP.NET Core依赖

两种方案二选一即可:

  1. 若类库仅需要少量ASP.NET Core接口,在Core类库项目中安装Microsoft.AspNetCore.Authentication.AbstractionsNuGet包,版本与主项目ASP.NET Core版本匹配。
  2. 若类库是面向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:24:03