I would like to pass user information to service layer like this (in net core web app):
services.AddScoped<RequestInfo>(provider =>
{
var context = provider.GetRequiredService<IHttpContextAccessor>();
var userJson = ((ClaimsIdentity)context.HttpContext.User.Identity).FindFirst("LoggedInUser").Value;
var user = JsonConvert.DeserializeObject<User>(userJson);
return new RequestInfo(int.Parse(user.UserId), user.ClientId);
});
This should work for controllers and services, but I also have BackgroundService to handle messages. I'd like to use user information from message before I resolve service to handle message. Is it possible to achieve or any workaround? Something like (pseudo code)
using var scope = serviceProvider.CreateScope();
SetupUserInfo(..have no access to ServiceCollection .., contract user info);
var service = scope.ServiceProvider.GetRequiredService(..my type);
Update My best idea
services.AddScoped<RequestInfo>();
var info = provider.GetRequiredService<RequestInfo>();
info.UserId = .. get info from http context somewhere in middleware (for API)
info.UserId = .. get info from message before resolve of main dependency (for Background service)