在生成JWT令牌时,我遇到了一个持续存在的问题,大约30%的情况。
原始设置使用依赖注入,但是为了查找错误,我在以下代码中实例化了Usermanager'fresh':
[AllowAnonymous]
[Route("token")]
public async Task<BaseResult> Token(string email, string password)
{
if (email == null) return new BaseResult(BaseResult.ResultCodes.InvalidInput, "not a user");
//var user = await UserManager.FindByNameAsync(email);
using (UserManager<User> usermanager = new UserManager<User>(new UserStore<User>(new UserContext()), null,
new PasswordHasher<User>(), null, null, null, null, null, null))
{
User user = await usermanager.FindByEmailAsync(email);
if (user == null)
return new BaseResult(BaseResult.ResultCodes.NotFound, "user not found");
if (usermanager.PasswordHasher.VerifyHashedPassword(user, user.PasswordHash, password) !=
PasswordVerificationResult.Success)
return new BaseResult(BaseResult.ResultCodes.InvalidInput, "password incorrect");
var token = await GetJwtSecurityToken(user);
return new TokenResult(new JwtSecurityTokenHandler().WriteToken(token), token.ValidTo);
}
//{
// token = new JwtSecurityTokenHandler().WriteToken(token),
// expiration = token.ValidTo
//});
}
在usermanager.FindByEmailAsync(email)上有30%的案例抛出异常,并显示:
System.InvalidOperationException:'连接未关闭。该 连接的当前状态是连接。'
由于在上面的行中创建了上下文,我不明白这个错误。考虑到SQL服务器没有完全从之前的请求中完成,尽管它在新启动时最常发生。
信息目的:我的背景:
public sealed class UserContext:IdentityDbContext<User>
{
public UserContext()
{
Database.EnsureCreatedAsync();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseSqlServer($"Server =PC; Database =PFUsers; Trusted_Connection = True;MultipleActiveResultSets=true;");
base.OnConfiguring(optionsBuilder);
}
}
虽然为了避免调试,但在使用DI时,相关的启动部分是:
services.AddEntityFrameworkSqlServer()
.AddDbContext<UserContext>(ServiceLifetime.Scoped);
services.AddIdentity<User, IdentityRole>()
.AddEntityFrameworkStores<UserContext>();
答案 0 :(得分:0)
删除MultipleActiveResultSets = true;从连接字符串中解决了它。
对于令牌请求,MARS会适得其反(单个请求的开销)