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

如何从自定义TripUser类获取用户标识以增删System.Security.Claims声明?

解决方案

问题根源

  1. List<Claim>.Remove()方法需要传入具体的Claim对象实例,而非lambda表达式条件,这是你最初尝试user.Claims.Remove(claim => claim.Type == "DefaultViewId")无效的原因。
  2. 自定义的TripUser类本身没有RemoveClaim和AddClaim方法,需要自行实现或直接操作其Claims列表。

实现方案

1. 给TripUser类添加Claim操作方法

直接在TripUser类中封装Claim的增删逻辑,方便调用:

using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Linq;

namespace Trip.Classes.Authentication
{
    public class TripUser
    {
        public int         Id           { get; set; }
        public string      Name         { get; set; }
        public string      Email        { get; set; }
        public DateTime    LastAccessed { get; set; }
        public List<Claim> Claims       { get; set; } = new List<Claim>();

        // 根据Claim类型移除匹配项
        public void RemoveClaim(string claimType)
        {
            // 移除所有同类型的Claim,若只需移除第一个可改用FirstOrDefault
            Claims.RemoveAll(c => c.Type == claimType);
        }

        // 添加Claim(自动覆盖同类型旧值)
        public void AddClaim(Claim claim)
        {
            RemoveClaim(claim.Type); // 先移除旧值避免重复
            Claims.Add(claim);
        }
    }
}

2. 修改SetDefaultId方法调用

现在可以直接调用TripUser的封装方法更新Claim:

public async Task<TripUser> SetDefaultId(TripUser user)
{
    int myNewDefaultId = 2;
    
    user.RemoveClaim("DefaultViewId");
    user.AddClaim(new Claim("DefaultViewId", myNewDefaultId.ToString()));
    
    return await Task.FromResult(user);
}

直接操作列表的替代写法

如果不想修改TripUser类,也可以直接用List<T>的RemoveAll方法实现条件移除:

// 移除所有匹配类型的Claim
user.Claims.RemoveAll(c => c.Type == "DefaultViewId");
// 添加新的Claim
user.Claims.Add(new Claim("DefaultViewId", myNewDefaultId.ToString()));

内容的提问来源于stack exchange,提问作者Mark Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:30:59