ASP .NET Core Web Api - przechowywanie danych z claims

0

Cześć,

w web api autoryzuje usera za pomocą tokena JWT. W Startup dodałem sobie weryfikowanie tokenu w bazie danych. Zastanawiam się w jaki sposób teraz zrobić coś takiego żebym mógł przy tej walidacji (OnTokenValidated) zapisać jakieś dane, do wykorzystania w requescie. Przykładowo na podstawie tokena jwt wyciągałbym sobie z DB userId.

Chciałbym to zrobić tak żeby mieć do tego dostęp w każdym kontrolerze. Myślałem żeby wstrzyknąć zależność, tylko nie bardzo wiem jak to zrobić poprawnie w tym przypadku.

Np. w ConfigureServices mam

services.AddScoped<IUserService, UserService>();

ale jak zrobić coś takiego w momencie w którym chce mieć jakieś wartości przechowywane?

Wrzucam kod do metody do konfiguracji tokenów:

public void ConfigureJwt(IServiceCollection services)
        {
            var serviceProvider = services.BuildServiceProvider();

            var config = serviceProvider.GetService<JWTConfiguration>();
            var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(config.SecretKey));

            var tokenValidationParameters = new TokenValidationParameters
            {
                IssuerSigningKey = signingKey,
                ValidIssuer = config.ValidIssuer,
                ValidAudience = config.ValidAudience,
                ClockSkew = TimeSpan.Zero
            };

            services.AddAuthentication(o =>
            {
                o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(c =>
            {
                c.RequireHttpsMetadata = false;
                c.SaveToken = true;
                c.TokenValidationParameters = tokenValidationParameters;
                c.Events = new JwtBearerEvents
                {
                    OnTokenValidated = context =>
                    {
                        var userService = serviceProvider.GetService<IUserService>();

                        if (!userService.CheckJwtToken(context.Request.Headers[HeaderNames.Authorization]).Result)
                            context.Fail("Błędny token.");

                        return Task.CompletedTask;
                    }
                };
            });
        }
3

Ale że takie coś?

 var claims = new List<Claim>
{
    new Claim("UserId", 666)
};
context.Principal.AddIdentity(new ClaimsIdentity(claims));
1

W Startup dodałem sobie weryfikowanie tokenu w bazie danych.

jwt sprawdzasz w bazie?

0

@WeiXiao: Tak, JWT wystawiam na kilka godzin, zapisuje je w bazie danych z datą wygaśnięcia i dzięki temu mam możliwość anulować taki token.

0

Czyli co, przy każdym strzale do API walisz do bazy, żeby sprawdzić czy token dalej jest aktualny?
Wydaję mi się, że do takich rzeczy używa się koncepcji z refresh tokenem. Masz wtedy token JWT wystawiony na przykład na 5 minut, a refresh token na godzinę lub kilka. Refresh token możesz w każdej chwili odwołać. Kwestia napisania odpowiedniej logiki po stronie klienckiej, aby po wygaśnięciu JWT tokena uzyskał nowy token z użyciem refresh tokenu.

0

@lukaszek016: Tak, przy każdym strzale sprawdzam czy token jest ważny. I tak muszę odkładać KAŻDĄ informację o autoryzacji użytkownika (wymóg Biznesu) w DB, więc sprawdzenie tego nie jest problemem.

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