I have jwt auth:
var messageHandlers = new JwtMessageHandler(_serviceProvider);
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
Events = new JwtBearerEvents
{
OnMessageReceived = messageHandlers.OnMessageReceived,
},
TokenValidationParameters = tokenValidationParameters
});
JwtMessageHandleris my custom handler. In the handler, I have to make several queries to the database, so I pass ServiceProviderand allow my user service:
public class JwtMessageHandler
{
private IUserService _userService;
public async Task OnMessageReceived(MessageReceivedContext arg)
{
...
_userService = (IUserService)arg.HttpContext.RequestServices.GetService(typeof(IUserService));
var isRoleChanged = await _userService.IsRoleChanged(tokenObject.Subject, rolesFromToken);
if (isRoleChanged)
{
GenerateBadResponse(arg);
return;
}
var canLogin = await _userService.CanLogin(tokenObject.Subject);
if (!canLogin)
{
GenerateBadResponse(arg);
return;
}
}
}
In the service, I make requests:
...
var user = await _userManager.FindByEmailAsync(email);
var currentRoles = await _userManager.GetRolesAsync(user);
..
OnMessageReceivedcalled for each request. When I have one request per page on the server, or I wait one or two seconds before doing something, everything works fine. But I have several pages on which I make 2-3 simultaneous requests to the server. And in this case, I get an error message:
The connection was not closed. The status of the current connection is connected to
I understand this problem with multithreading. JwtMessageHandlerIt is created once when the application starts. So, I put the line:
_userService = (IUserService)_serviceProvider.GetService(typeof(IUserService));
, . . , null _userService .
?