从 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" 确实如此!
我是不是漏掉了什么???我很确定我没听懂你的问题...
我正在登录时创建声明列表:
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" 确实如此!
我是不是漏掉了什么???我很确定我没听懂你的问题...