如何从自定义TripUser类获取用户标识以增删System.Security.Claims声明?
解决方案
问题根源
List<Claim>.Remove()方法需要传入具体的Claim对象实例,而非lambda表达式条件,这是你最初尝试user.Claims.Remove(claim => claim.Type == "DefaultViewId")无效的原因。- 自定义的
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
相关产品推荐
相关产品推荐

