#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