ASP. net Ошибка основного API при реализации JWT в конфигурации. - PullRequest
2 голосов
/ 20 февраля 2020

Я недавно добавил в свой код метод JWT для аутентификации пользователей, после реализации всей конфигурации, с которой я столкнулся в Exception в CreateHostBuilder (args) .Build (). Run () в файле программы. Ошибка, с которой я сталкиваюсь:

System.AggregateException: 'Некоторые службы не могут быть построены (Ошибка при проверке дескриптора службы' ServiceType: Dmail.Core.Application.Login.LoginBL Срок действия: Переходный ImplementType: Dmail.Core.Application.Login.LoginBL ': невозможно активировать тип' Dmail.Core.Application.Login.LoginBL '. Следующие конструкторы неоднозначны: Void .ctor (Microsoft.Extensions.Configuration.IConfiguration) Void .ctor (Dmail.Core.Contracts.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>();

Класс LoginBL:

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;

    }
}

Если вам нужно, чтобы я показал вам больше файлов, дайте мне знать, так как в моем проекте довольно много файлов

1 Ответ

4 голосов
/ 20 февраля 2020

У вас есть два разных конструктора, поэтому контейнер не знает, какой из них создать:

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

Предположительно, вам нужен один конструктор, который принимает оба:

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