Я пытаюсь добавить подкаталог на свой сервер идентификации, чтобы я мог использовать его с nginx
.
Обратите внимание, что это сервер идентификации с пользовательским интерфейсом, см. ( quickstart ui )
После изучения проблем github
для сервера идентификации мне удалось найти код для фактического добавления подкаталога.
Вот моя конфигурация:
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Map("/auth", app =>
{
app.UseRouting();
app.UseStaticFiles();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
app.UseIdentityServer();
});
}
Однако, когда я перехожу на http://xxx:8888/auth/account/login
и пытаюсь войти в систему и получить идентификационный код ie, URL остается прежним, и у меня появляется пустой экран и никаких файлов cookie. Что должно произойти, это то, что я должен быть перенаправлен обратно на домашнюю страницу с конкретным пользователем, вошедшим в систему.
Это, кажется, происходит, только когда я добавляю подкаталог.
К сведению, хорошо известные конечные точки работает нормально при получении токена доступа password
или resource owner
с /auth
.
Вот мои службы конфигурации, здесь что-то не хватает?:
public void ConfigureServices(IServiceCollection services)
{
string connectionString = Configuration.GetConnectionString("AzureConnection");
var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
});
services.AddControllersWithViews().AddRazorRuntimeCompilation();
services.AddRazorPages()
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
});
services.AddDbContext<IdentityDbContext>(options => options.UseSqlServer(connectionString, sql => sql.MigrationsAssembly(migrationsAssembly)));
services.AddDbContext<ConfigurationDbContext>(options => options.UseSqlServer(connectionString, sql => sql.MigrationsAssembly(migrationsAssembly)));
services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
options.SignIn.RequireConfirmedEmail = true;
})
.AddEntityFrameworkStores<IdentityDbContext>()
.AddDefaultTokenProviders();
services.AddAuthentication()
.AddOpenIdConnect("azuread", "Azure AD", options => Configuration.Bind("AzureAd", options));
services.Configure<OpenIdConnectOptions>("azuread", options =>
{
options.GetClaimsFromUserInfoEndpoint = true;
options.SaveTokens = true;
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("email");
options.Events = new OpenIdConnectEvents()
{
OnRedirectToIdentityProviderForSignOut = context =>
{
context.HandleResponse();
context.Response.Redirect("/Account/Logout");
return Task.FromResult(0);
}
};
});
var builder = services.AddIdentityServer(options =>
{
options.IssuerUri = "http://xxx:8888";
options.PublicOrigin = "http://xxx:8888";
options.Events.RaiseErrorEvents = true;
options.Events.RaiseInformationEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseSuccessEvents = true;
options.UserInteraction.LoginUrl = "/Account/Login";
options.UserInteraction.LogoutUrl = "/Account/Logout";
options.Authentication = new IdentityServer4.Configuration.AuthenticationOptions()
{
CookieLifetime = TimeSpan.FromHours(10), // ID server cookie timeout set to 10 hours
CookieSlidingExpiration = true
};
})
.AddConfigurationStore(options =>
{
options.ConfigureDbContext = b => b.UseSqlServer(connectionString, sql => sql.MigrationsAssembly(migrationsAssembly));
})
.AddOperationalStore(options =>
{
options.ConfigureDbContext = b => b.UseSqlServer(connectionString, sql => sql.MigrationsAssembly(migrationsAssembly));
options.EnableTokenCleanup = true;
})
.AddAspNetIdentity<ApplicationUser>();
}
Это действительно доступно для тестирования на виртуальной машине с публичным c URL по запросу.