从 ASP.NET Web API 中的列表<Claim> 中获取项目

Get an item from List<Claim> in ASP.NET Web API

我正在登录时创建声明列表:

var claims = new List<Claim>
            {
                new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
                new Claim("Testing", "test")
            };

Login 方法没有授权,因此声明尚未保存或 cookie 尚未创建,但列表包含创建的 userId,我想将其保存在 activity 日志中( table):

var activityLog = new AccessLogEntity
            {
                ActivityDate = DateTime.UtcNow,
                UserId = ## get from claims (List<Claim>
            };

            await _context.tbl_ActivityLogs.AddAsync(activityLog);
            await _context.SaveChangesAsync();

我怎样才能做到这一点?

(我没有完全理解这个问题,或者我根本没有理解它。)

我从未使用过 Claims 或 ASP.NET 核心。但是,如果您的构造函数中的第二个参数是您想要获取的 UserId,如

var claims = new List<Claim>
            {
                new Claim(JwtRegisteredClaimNames.Sub, /* -----> */ user.UserName /*<------ this one here */ )   ,
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
                new Claim("Testing", /* -----> */"test"/* <----- Or this */)
            };

您可以使用

轻松做到这一点
claims[0 /* Or whichever you want to get*/].Value;

完整代码

var activityLog = new AccessLogEntity
{
    ActivityDate = DateTime.UtcNow,
    UserId = claims[i /*Or whatever*/].Value;
};

await _context.tbl_ActivityLogs.AddAsync(activityLog);
await _context.SaveChangesAsync();

编辑:

如果您不想对索引进行硬编码,而是希望从名称标识符中获取用户名,请使用如下内容:

public string getUsernameFromID(List<Claim> claims, string id)
{

   foreach (var cl in claims)
   {
       if (cl.Type == id)
       {

           return cl.Value;     
       }
    }
    return "";
}

像这样使用它:

getUsernameFromID(claims, "Testing");  // Which returns "test"

在这种情况下 return "test" 确实如此!

我是不是漏掉了什么???我很确定我没听懂你的问题...