Добавить IdentityUser в HttpContext.User

#c# #asp.net-core

#c# #asp.net-core

Вопрос:

Я использую .NET Core 3.0 . Я пытаюсь аутентифицировать пользователя с помощью авторизации по ключу API. Я создал промежуточное программное обеспечение, которое вызывается каждый раз при вызове конечной точки контроллера. Я могу аутентифицировать пользователя и получать утверждения, но я не могу настроить HttpContext.User объект на использование этого идентификатора.

    public async System.Threading.Tasks.Task Invoke(HttpContext context, Services.AuthenticationService authenticationService, UserManager<IdentityUser> userManager, SignInManager<IdentityUser> _signInManager)
        {
            if (!context.Request.Path.ToString().Contains("Token") amp;amp; context.Request.Path.StartsWithSegments(new PathString("/api")))
            {
                var userKey = context.Request.Headers["user-key"];

                 // Register the user and its claims to the session
                var user = authenticationService.GetUserFromToken(userKey);
                var claims = await userManager.GetClaimsAsync(user);

                if (claims == null)
                {
                    context.Response.StatusCode = 401; //UnAuthorized
                    await context.Response.WriteAsync("Claims not found for user");
                    return;
                }

                var claimsIdentity = new ClaimsIdentity(IdentityConstants.ApplicationScheme);
                claimsIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id));
                claimsIdentity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
                claimsIdentity.AddClaims(claims);
                context.User.AddIdentity(claimsIdentity);
                await _signInManager.Context.SignInAsync(IdentityConstants.ApplicationScheme, new ClaimsPrincipal(claimsIdentity));
            }

            await _next.Invoke(context);
        }
  

Когда я проверяю HttpContext.User в своем контроллере, у основного объекта identity нет информации. В объекте Identities есть два идентификатора. Второй идентификатор содержит утверждение и имя пользователя, которые я установил в промежуточном программном обеспечении.

Как мне настроить основной идентификатор на то, чтобы он был единственным идентификатором? _signInManager Код на самом деле ничего не делает, и я получаю те же результаты в HttpContext.User объекте с ним или без него.

Комментарии:

1.На мой взгляд, если вы проверили, что токен действителен, нет необходимости снова вызывать SignInAsync в вашем промежуточном программном обеспечении, вы могли бы напрямую задать утверждения, как показано ниже: var claims = new List<Claim> { /* add claims */ }; var userIdentity = new ClaimsIdentity(claims, ClaimTypes.Name); context.User = new ClaimsPrincipal(userIdentity);

2. Хорошо, итак, это было так же просто, как просто установить контекст. Пользователь = участнику claims. По какой-то причине я не ожидал, что это будет настраиваемый параметр. Спасибо за это. Однако я не могу принять ваш комментарий в качестве ответа.