ASP.net核心API在配置中实现JWT时出错



我最近在代码中添加了JWT方法来验证用户,在实现了程序文件中CreateHostBuilder(args(.Build((.Run((处面临的所有配置之后。我面临的错误:

System.AggregateException:"无法构造某些服务(验证服务描述符"ServiceType:Dmail.Core.Application.Login.LoginBL生存期:瞬态实现类型:Dmail.Core.Application.LoginBL"时出错:无法激活类型"Dmail.Core.Application.LoginBL"。以下构造函数不明确:Void.ctor(Microsoft.Extensions.Configuration.IConfiguration(Void.ctor(Dmail.Core.CContracts.IUserRepository(('

这是我的登录验证配置:

services.AddCors(options => {
options.AddPolicy("CorsPolicy", builder => 
builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials().Build());
});
services.AddControllers();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["Jwt:Issuer"],
ValidAudience = Configuration["Jwt: Issuer"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
};
});
services.AddMvc(option => option.EnableEndpointRouting = false).AddMvcOptions(o =>
{
o.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
});
services.AddTransient<IUserRepository, UserRepository>();
services.AddTransient<LoginBL, LoginBL>();
services.AddTransient<GetUserBL, GetUserBL>();
services.AddTransient<UserPresenter, UserPresenter>();

登录类:

public class LoginBL
{
private readonly IUserRepository _userRepo;
private readonly IConfiguration _config;
public LoginBL(IConfiguration config)
{
_config = config;
}
public LoginBL(IUserRepository userRepo)
{
_userRepo = userRepo;
}
public async Task<LoginResponse> HandleAuthentication(LoginRequest input)
{
var auth = await _userRepo.Authenticate(input.Email, input.Password);
if (auth == null)
{
return null;
}
else
{
var tokenStr = GenerateJSONWebToken(auth);
var output = new LoginResponse()
{
Id = auth.Id,
Username = auth.Username,
FirstName = auth.FirstName,
LastName = auth.LastName,
Token = tokenStr,
ListOfEmails = auth.ListOfEmails
};
return output;
}
}
private string GenerateJSONWebToken(User userinfo)
{
var securityKey = new 
SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
var credentials = new SigningCredentials(securityKey, 
SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, userinfo.FirstName),
new Claim(JwtRegisteredClaimNames.Email, userinfo.Username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var token = new JwtSecurityToken(
issuer: _config["Jwt:Issuer"],
audience: _config["Jwt:Issuer"],
claims,
expires: DateTime.Now.AddMinutes(120),
signingCredentials: credentials);
var encodetoken = new JwtSecurityTokenHandler().WriteToken(token);
return encodetoken;
}
}

如果你需要我给你看更多的文件,请告诉我,因为我的项目中有很多文件

您有两个不同的构造函数,所以容器不知道实例化哪一个:

public LoginBL(IConfiguration config)
{
_config = config;
}
public LoginBL(IUserRepository userRepo)
{
_userRepo = userRepo;
}

大概你想要一个同时接受两者的构造函数:

public LoginBL(IConfiguration config, IUserRepository userRepo)
{
_config = config;
_userRepo = userRepo;
}

最新更新