Odczytywanie claim w controllerze

0

Mam dwa serwisy
Core oraz Identity

Core ma jwtmiddleware w ktorym mam taki kod

private async void AttachUserToContext(HttpContext context, string token)
        {
            try
            {
                var response = await _httpClient.PostAsync($"authentication/authenticate?token={token}",
                    new StringContent(""));
                var responseContent = await response.Content.ReadAsStringAsync();
                var userPayload = JsonConvert.DeserializeObject<UserResponse>(responseContent);
                context.Items["UserId"] = userPayload.Id;
            }
            ...
        }

wszystko swietnie, ale chcialbym zapisac gdzies ta informacje, bo dalej idzie request do controllera w ktorym to UserId bym z checia uzyl

probowalem roznych sposobow, ale glownym problemem jest brak HttpContext property w controllerze

[ExtendObjectType(Name = "Mutation")]
    public class UserMutation
    {
        [Authorize]
        [GraphQLType(typeof(EitherUnionType<Error, VoidResponse>))]
        public async Task<object> ChangeNickname(
            UserInputNickname userInputNickname,
            [Service] IUserAccountService userAccountService)
        {
            var result = await userAccountService.ChangeNickname(userID, userInputNickname);

            return result.Unwrap();
        }
    }

np tutaj chcialbym miec to userID ktore odczytuje w middleware.

pomysly jakies?

0

Jedynie mi co przychodzi do glowy to jakis Singleton i Injectowac to do serwisu, jednak martwie sie czy jest to dobre rozwiazanie (szczegolnie jezeli chodzi o concurrency, nie jestem pewien czy nie bedzie z tym zadnego problemu)

3

Sprawdź sobie - IHttpContextAccessor. Jeżeli miałbyś klasę, która jest rejestrowana jako AddScoped to nie ma z tym problemu.
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-5.0

0

Nie wiem jakie masz te controllery ale ja dziedzicze z : ControllerBase
potem w akcji mam:

var userId = HttpContext.User.GetUserId();

a GetUserId to jest extension method

public static class ClaimsPrincipalExtensions
    {
        public static string GetUserId(this ClaimsPrincipal principal)
        {
            if (principal == null)
                throw new ArgumentNullException(nameof(principal));

            return principal.FindFirst(nameof(User.Id))?.Value;
        }        
    }

Tylko informacje o Id usera mam w tokenie

1 użytkowników online, w tym zalogowanych: 0, gości: 1