В настоящее время мне не удается обернуть голову вокруг претензий. У меня есть проект ASP.Net Core 3 с угловым шаблоном и пользователями, хранящимися в приложении.
Я хочу добавить претензии своим пользователям, читая, я думал, что это будет легко, просто добавьте что-то вроде
await _UserManager.AddClaimAsync(user, new Claim(AccountStatic.ClaimTypes._Claim_Id, user.Id));
Когда вы создаете пользователя, а затем получаетевернитесь с помощью строки ниже, как только они снова войдут в систему:
User.FindFirst(AccountStatic.ClaimTypes._Claim_Id)?.Value;
Это, однако, не работает. Я вижу, что заявки записываются в таблицу AspNetUserClaims
в моей базе данных, но их нет в заявках пользователей при входе в систему. Есть еще несколько заявок, но не те, которые я добавил.
Нужно ли где-то определять, какие из утверждений пользователей включаются при входе в систему?
Редактировать. Я нашел сообщение о том, что мне нужно добавлять утверждения с помощью DI AddClaimsPrincipalFactory. Поэтому я добавил этот класс.
public class UserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
public UserClaimsPrincipalFactory(UserManager<ApplicationUser> userManager,IOptions<IdentityOptions> optionsAccessor): base(userManager, optionsAccessor)
{}
//https://levelup.gitconnected.com/add-extra-user-claims-in-asp-net-core-web-applications-1f28c98c9ec6
protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
{
var identity = await base.GenerateClaimsAsync(user);
identity.AddClaim(new Claim(AccountStatic.ClaimTypes.Claim_Id, user.Id ?? "[no id]"));
return identity;
}
}
И если я перешагну через код, то увижу, что здесь добавляются претензии. Но в контроллере мои пользовательские претензии отсутствуют.
internal string GetUserId()
{
if (User.Identity.IsAuthenticated == false)
return null;
return User.FindFirst(AccountStatic.ClaimTypes.Claim_Id)?.Value;
}
Обновление. Хорошо, я нахожу это очень странным. Я пытался сделать то, что другие утверждают, что работа, но для меня ничто не дает мне имя пользователя или идентификатор. осматривая User
я получаю следующее. Ничто здесь не содержит ссылки на вошедшего в систему пользователя.
Обновление 2: Только что заметил, что там на самом деле есть Id: {http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier: ed107a11-6c62-496b-901e-ed9e6497662a}
Кажется, это идентификатор пользователяиз базы данных. Пока не уверен, как получить к нему доступ.
Они возвращают ноль.
User.FindFirst(JwtRegisteredClaimNames.NameId)?.Value;
User.FindFirst("nameidentifier")?.Value;
User.FindFirst("NameIdentifier")?.Value;
Еще одно обновление Я использую UserClaimsPrincipalFactory
и ломаю его, глядя на утверждения. Я вижу, что всете, которые я хочу, там. Но опять же, они не доступны в моих контроллерах API, как видно на первом рисунке.