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;
}
};
});
}