как решить цикл в IdentityServer4 — подключение / авторизация / обратный вызов?client_id=?

#c# #asp.net-core #identityserver4 #blazor

#c# #asp.net-ядро #identityserver4 #блейзор

Вопрос:

привет, сообщество, у меня есть проект, созданный с asp.net core, blazor webassembly и Identity4, локальный проект работает очень хорошо, я опубликовал его на сервере IIS, чтобы его можно было увидеть из Интернета, проект был загружен отлично, единственная деталь заключается в том, что когда я ввожу логин, он загружается,пока я не передам его в пустой кеш и не загружу принудительно, я могу ввести форму входа, затем я ввожу свои учетные данные, и снова он продолжает загружаться, пока я снова не очищу кеш и не перейду на страницу, которая указывает, что я уже вошел в систему.

Как я могу ввести форму входа в систему, не очищая кэш и не загружая принудительно?

Когда я нажимаю кнопку входа, он отправляет меня на этот маршрут, но это неправильно:

 connect/authorize?client_id=BlazorApp.Clientamp;redirect_uri=https%3A%2F%2
  

это маршрут, который мне подходит:

 Identity/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id
  

это запуск моего класса:

  public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {         

            services.AddDbContext<SimulexContext>
                          (options => options.UseSqlServer(Configuration.GetConnectionString("SimulexConnection")));

           
            services.AddDefaultIdentity<ApplicationUser>(options => {
            options.SignIn.RequireConfirmedAccount = true;
            options.Password.RequireDigit = false;
            options.Password.RequireLowercase = false;
            options.Password.RequireUppercase = false;
            options.Password.RequireNonAlphanumeric = false;
            })
            .AddRoles<IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>();

            services.AddIdentityServer()
                .AddApiAuthorization<ApplicationUser, ApplicationDbContext>()
                .AddProfileService<IdentityProfileService>();

            services.AddAuthentication()
               .AddIdentityServerJwt();

            services.Configure<PayPalConfiguration>(Configuration.GetSection("PayPal"));
           

            services.AddControllersWithViews();
            services.AddRazorPages();

           
            services.AddAutoMapper(typeof(Startup));

            
            services.AddScoped<NotificacionesService>();

            
            services.AddScoped<IAlmacenadorDeArchivos, AlmacenadorArchivosLocal>();
            
            services.AddHttpContextAccessor();

            
            services.AddMvc().AddNewtonsoftJson(options =>
            options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseWebAssemblyDebugging();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseBlazorFrameworkFiles();
            app.UseStaticFiles();

            app.UseRouting();            
            
            app.UseAuthentication();
            app.UseIdentityServer();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/api/config/notificacionesllavepublica", async context =>
                 {
                     var configuration = context.RequestServices.GetRequiredService<IConfiguration>();
                     var llavePublica = configuration.GetValue<string>("notificaciones:llave_publica");
                     await context.Response.WriteAsync(llavePublica);
                 });

                endpoints.MapRazorPages();
                endpoints.MapControllers();              
                endpoints.MapFallbackToFile("index.html");
            });
        }
    }
  

это моя страница appsettingsjson:

 "IdentityServer": {
    "Key": {
      "Type": "Development"
    },
    "Clients": {
      "BlazorApp.Client": {
        "Profile": "IdentityServerSPA"
      }
    }
  },
  

Комментарии:

1. Вы разобрались с этой проблемой?

Ответ №1:

Можете ли вы поделиться своим запуском для приложения blazor?

У меня была такая же проблема пару недель назад, но с asp.net приложение mvc при интеграции is4, с которым была настроена идентификация. Так что это может быть то же самое для вас.

Решение Enet может сработать, но я его не пробовал. Ниже приведено другое решение, которое сработало для меня, только если у вас настроена идентификация в вашем приложении Blazor. Попробуйте настроить схемы в вашем services.AddAuthentication и AddOpenIdConnect :

 services.AddAuthentication(options =>
{
    options.DefaultScheme = "Cookies";
    options.DefaultChallengeScheme = "Oidc";
    options.DefaultAuthenticateScheme = "Cookies"; // <-- add this line
})
    .AddCookie("Cookies", options =>
    {
    })
    .AddOpenIdConnect("oidc", options =>
    {
        options.SignInScheme = "Cookies"; // <-- add this line
    })
;
  

Комментарии:

1. Я попробовал код, который вы даете мне в качестве примера, но я получаю следующую ошибку: ArgumentException: Options. Должен быть указан идентификатор клиента (параметр ‘ClientID’)

2. Этот код предназначался для приложения blazor, и я удалил некоторый код, как я предполагал, у вас уже был, можете ли вы обновить свой вопрос, включив в него код запуска приложения blazor.cs?

3. какой класс запуска вам нужен? я уже опубликовал свой класс запуска выше

4. Вышеупомянутый запуск из blazor или identityserver4?

5. Я поместил identity4 в проект blazor webassembly, конфигурация identity4 находится в классе startup