Вам, конечно, не нужно включать ASP.NET Core Identity в ваш клиентский проект, но вы можете использовать его для получения вдохновения о том, как добиться того, что вы ищете. Давайте начнем с рассмотрения реализации RefreshSignInAsync
:
public virtual async Task RefreshSignInAsync(TUser user)
{
var auth = await Context.AuthenticateAsync(IdentityConstants.ApplicationScheme);
var authenticationMethod = auth?.Principal?.FindFirstValue(ClaimTypes.AuthenticationMethod);
await SignInAsync(user, auth?.Properties, authenticationMethod);
}
Как видно выше, это также вызывает SignInAsync
, который выглядит следующим образом:
public virtual async Task SignInAsync(TUser user, AuthenticationProperties authenticationProperties, string authenticationMethod = null)
{
var userPrincipal = await CreateUserPrincipalAsync(user);
// Review: should we guard against CreateUserPrincipal returning null?
if (authenticationMethod != null)
{
userPrincipal.Identities.First().AddClaim(new Claim(ClaimTypes.AuthenticationMethod, authenticationMethod));
}
await Context.SignInAsync(IdentityConstants.ApplicationScheme,
userPrincipal,
authenticationProperties ?? new AuthenticationProperties());
}
Два вызова, которые нас больше всего интересуют:
Context.AuthenticateAsync
, который создает AuthenticateResult
, содержащий как ClaimsPrincipal
, так и AuthenticationProperties
, которые были прочитаны из файла cookie.
Context.SignInAsync
, что в итоге переписывает куки с ClaimsPrincipal
и связанными AuthenticationProperties
.
ASP.NET Core Identity создает совершенно новый ClaimsPrincipal
, который обычно берется из базы данных, чтобы «обновить» его. Вам не нужно этого делать, поскольку вы просто хотите использовать существующий ClaimsPrincipal
с дополнительной претензией. Вот полное решение для ваших требований:
var authenticateResult = await HttpContext.AuthenticateAsync();
if (authenticateResult.Succeeded)
{
var claimsIdentity = (ClaimsIdentity)authenticateResult.Principal.Identity;
if (!claimsIdentity.HasClaim(c => c.Type == "your-claim"))
{
claimsIdentity.AddClaim(new Claim("your-claim", "your-value"));
await HttpContext.SignInAsync(authenticateResult.Principal, authenticateResult.Properties);
}
}
При вызове HttpContext.AuthenticateAsync
будет использоваться схема по умолчанию, которую вы уже настроили в своей конфигурации ("Cookies"
), чтобы получить доступ к ClaimsPrincipal
и AuthenticationProperties
. После этого это просто случай добавления новой заявки и выполнения вызова на HttpContext.SignInAsync
, который также будет использовать схему по умолчанию ("Cookies"
).