Получить элемент из списка <Claim>в ASP. NET Web API - PullRequest
0 голосов
/ 07 мая 2020

Я создаю список претензий при входе в систему:

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")
            };

Нет авторизации для метода входа в систему, поэтому претензии не были сохранены или повар ie не был создан, но list содержит созданный userId, и я хочу сохранить его в журнале активности (таблице):

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

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

Как я могу этого добиться?

1 Ответ

0 голосов
/ 07 мая 2020

(Я не полностью понял вопрос или, может быть, я его совсем не понял.)

Я никогда не использовал Claims или ASP. NET core. Однако, если вторым параметром в вашем конструкторе является 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"

который в этом случае вернет "test", и это действительно так!

Я что-то упустил ??? Я почти уверен, что не понял твой вопрос ...

...