Получение «Учетные данные для подписи не настроены в разделе конфигурации« IdentityServer:Key »». ошибка в ASP.NET Core Web API с IdentityServer

Я работаю над внутренним проектом, созданным с использованием веб-API ASP.NET Core 3.1. Все работало нормально, пока я не решил перенести свой проект на .NET 6, я обновил все библиотеки в соответствии с новым целевым фреймворком.

Теперь при запуске моего веб-API URL-адрес проверки работоспособности работает нормально, но при попытке открыть swagger или вызвать конечную точку моего веб-API я получил эту ошибку:

Учетные данные для подписи не настраиваются в разделе конфигурации «IdentityServer:Key».

У меня не было этой проблемы, когда я работал на .NET Core 3.1, я погуглил и обнаружил, что добавление этой функции.AddDeveloperSigningCredential()может решить проблему, но это не сработало для меня.

Вот мой код:

      public static class ProgramExtensions
{
    readonly static string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";

    private const string SecretKey = "**********************";
    private static readonly SymmetricSecurityKey _signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SecretKey));

    public static IConfiguration? Configuration { get; set; }

    public static WebApplicationBuilder ConfigureBuilder(this WebApplicationBuilder builder)
    {
        Configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                  .AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json",
                                 optional: true, reloadOnChange: true).Build();
        
        AppDbContext.ConnectionString = Configuration.GetConnectionString("myCX");
        builder.Services.AddSingleton<IEmailConfiguration>(Configuration.GetSection("EmailConfiguration").Get<EmailConfiguration>());
        builder.Services.AddApplication();
        services.AddDbContext<AppDbContext>(options =>
            options.UseSqlServer(
                connectionString,
                 x => x.UseNetTopologySuite()
                 .CommandTimeout(10000)));
      
        services.AddScoped<IAppDbContext>(provider => provider.GetService<AppDbContext>());
        services.AddTransient(typeof(IAppLogger<>), typeof(LoggerAdapter<>));

        services.AddIdentity<ApplicationUser, IdentityRole>(opt =>
        {
            opt.Password.RequiredLength = 7;
            opt.Password.RequireDigit = false;
            opt.Password.RequireUppercase = false;
            opt.User.RequireUniqueEmail = true;
        }).AddEntityFrameworkStores<AppDbContext>()
            .AddDefaultTokenProviders();

        services.AddIdentityServer()
            .AddDeveloperSigningCredential()
                .AddApiAuthorization<ApplicationUser, AppDbContext>();

        builder.Services.AddSingleton<IJwtFactory, JwtFactory>();

        builder.Services.AddScoped<JwtIssuerOptions>();
        // Get options from app settings
        var jwtAppSettingOptions = Configuration.GetSection(nameof(JwtIssuerOptions));

        // Configure JwtIssuerOptions
        builder.Services.Configure<JwtIssuerOptions>(options =>
        {
            options.Issuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
            options.Audience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)];
            options.SigningCredentials = new SigningCredentials(_signingKey, SecurityAlgorithms.HmacSha256);
        });

        var tokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)],

            ValidateAudience = true,
            ValidAudience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)],

            ValidateIssuerSigningKey = true,
            IssuerSigningKey = _signingKey,

            RequireExpirationTime = false,
            ValidateLifetime = true,
            ClockSkew = TimeSpan.Zero
        };

        builder.Services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

        }).AddJwtBearer(configureOptions =>
        {
            configureOptions.ClaimsIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
            configureOptions.TokenValidationParameters = tokenValidationParameters;
            configureOptions.SaveToken = true;
        });

        builder.Services.AddAuthorization();

        builder.Services.AddControllers();
        builder.Services.AddSwaggerGen(c => c.SwaggerDoc("v1", new OpenApiInfo { Title = "COVAL API", Version = "v1" }));

        builder.Services.AddHealthChecks()
        .AddDbContextCheck<AppDbContext>();

        return builder;
    }

    public static WebApplication ConfigureApplication(this WebApplication app)
    {
        app.UseCors(MyAllowSpecificOrigins);
        app.UseCustomExceptionHandler();
        app.UseHealthChecks("/health", new HealthCheckOptions
        {
            ResponseWriter = async (context, report) =>
            {
                context.Response.ContentType = "application/json";
                var response = new HealthCheckReponse
                {
                    Status = report.Status.ToString(),
                    HealthChecks = report.Entries.Select(x => new IndividualHealthCheckResponse
                    {
                        Component = x.Key,
                        Status = x.Value.Status.ToString(),
                        Description = $"{JsonConvert.SerializeObject(x)}\n{x.Value.Data}\n{x.Value.Description}\n{x.Value.Exception?.Message}\n{x.Value.Exception?.StackTrace}"

                    }),
                    HealthCheckDuration = report.TotalDuration
                };
                await context.Response.WriteAsync(JsonConvert.SerializeObject(response));
            }
        });

        app.UseHttpsRedirection();
        app.UseAuthentication();
        app.UseIdentityServer();
        app.UseRouting();
        app.UseAuthorization();
       
        // Enable middleware to serve generated Swagger as a JSON endpoint.
        app.UseSwagger();

        // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), specifying the Swagger JSON endpoint.
        app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"));

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
        return app;
    }
}

Может ли кто-нибудь сказать мне, что мне не хватает в моем коде, или что мне делать, чтобы решить эту проблему?

Большое спасибо.

0 ответов

Другие вопросы по тегам