Я использую IdentityServer4 (3.1.1) & ASP. NET Ядро 3.1 с бритвенными страницами.
Ниже приведен мой Код startup.cs
public void ConfigureServices(IServiceCollection services)
{
var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
var connectionString = Configuration.GetConnectionString("DefaultConnection");
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(connectionString));
services.AddIdentity<ApplicationUser, IdentityRole>(option =>
{
option.User = new UserOptions { RequireUniqueEmail = true };
option.Password.RequireDigit = false;
option.Password.RequiredLength = 8;
option.Password.RequiredUniqueChars = 0;
option.Password.RequireLowercase = false;
option.Password.RequireNonAlphanumeric = false;
option.Password.RequireUppercase = false;
option.User.RequireUniqueEmail = true;
option.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;
option.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.Configure<IISOptions>(iis =>
{
iis.AuthenticationDisplayName = "Windows";
iis.AutomaticAuthentication = false;
});
services.AddControllersWithViews();
var builder = services.AddIdentityServer(options =>
{
options.Events.RaiseErrorEvents = true;
options.Events.RaiseInformationEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseSuccessEvents = true;
options.UserInteraction.LoginUrl = "/Identity/Account/Login";
options.UserInteraction.LogoutUrl = "/Identity/Account/Logout";
options.Authentication = new 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));
})
// this adds the operational data from DB (codes, tokens, consents)
.AddOperationalStore(options =>
{
options.ConfigureDbContext = b =>
b.UseSqlServer(connectionString, sql => sql.MigrationsAssembly(migrationsAssembly));
// this enables automatic token cleanup. this is optional.
options.EnableTokenCleanup = false;
options.TokenCleanupInterval = 3600;
})
.AddAspNetIdentity<ApplicationUser>();
services.AddRazorPages(options =>
{
//options.AllowAreas = true;
options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
});
//configures the application cookie to redirect on challenge, etc.
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = $"/Identity/Account/Login";
options.LogoutPath = $"/Identity/Account/Logout";
options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});
builder.AddDeveloperSigningCredential();
services.AddTransient<IEmailSender, EmailSender>();
services.Configure<AuthMessageSenderOptions>(Configuration);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
InitializeDatabase(app);
app.UseCookiePolicy();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
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.UseStaticFiles();
app.UseRouting();
app.UseCors();
app.UseIdentityServer();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Ниже приведен мой React-код для входа в систему. JS для перенаправления
redirectToRegister() {
this.redirectToApiAuthorizationPath(
`${ApplicationPaths.IdentityRegisterPath}?${
QueryParameterNames.ReturnUrl
}=${encodeURI(ApplicationPaths.Login)}`
);}
Ниже приведен авторизация. js Код
var settings = {
authority: "https://localhost:44306",
client_id: "Application.UI",
redirect_uri: "http://localhost:3000/authentication/login-callback",
response_type: "code",
scope: "openid profile WebApi",
post_logout_redirect_uri:
"http://localhost:3000/authentication/logout-callback"
};
При нажатии на ссылку регистрации перейдите по приведенному ниже URL-адресу
https://localhost: 44306 / личность / учетная запись / регистрация? ReturnUrl = / аутентификация / логин
Когда, наконец, нажмите на регистр, перейдите по ссылке ниже
https://localhost: 44306 / аутентификация / логин
Хотя это должно быть
http://localhost: 3000 / аутентификация / логин Таким образом, он может перейти к нужному URL с обратным URL-адресом https://localhost: 44306 / Аутентификация / логин-обратный вызов
При использовании localhost или другой прямой ссылки выведите следующую ошибку
An unhandled exception occurred while processing the request.
InvalidOperationException: указанный URL-адрес не является локальным. URL с абсолютным путем считается локальным, если у него нет части хоста / органа. URL-адреса, использующие виртуальные пути ('~ /'), также являются локальными. Microsoft.AspNetCore. Mvc .Infrastructure.LocalRedirectResultExecutor.ExecuteAsyn c (контекст ActionContext, результат LocalRedirectResult)
заголовки файлов cookie для запросов стека Маршрутизация InvalidOperationException: указанный URL-адрес не является локальным. URL с абсолютным путем считается локальным, если у него нет части хоста / органа. URL-адреса, использующие виртуальные пути ('~ /'), также являются локальными. Microsoft.AspNetCore. Mvc .Infrastructure.LocalRedirectResultExecutor.ExecuteAsyn c (контекст ActionContext, результат LocalRedirectResult) Microsoft.AspNetCore. Mvc .LocalRedirectResult. .ResourceInvoker.g__Logged | 21_0 (Средство вызова ResourceInvoker, результат IActionResult) Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.g__Awaited | 29_0 (Средство вызова ResourceInvoker, задача lastTask, следующее состояние, область действия Scope, состояние объекта, bool isComled). . Mvc .Infrastructure.ResourceInvoker.Rethrow (ResultExecutedContextSealed context) Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.ResultNext (ref State next, ref Область действия, ref объектное состояние, ref bool isCompleted) Microsoft.Asp69C. * .Infrastructure.ResourceInvoker.InvokeResultFilters () Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.g__Awaited | 24_0 (ResourceInvoker invoker, Задача lastTask, Состояние следующее, Область действия, объект) состояние ct, bool isCompleted) Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.Rethrow (контекст ResourceExecutedContextSealed) Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.Next (ссылка «Состояние следующее», «ссылка» Область действия, состояние объекта ref, состояние объекта ref, bool isCompleted) Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.g__Awaited | 19_0 (ResourceInvoker invoker, Task lastTask, следующее состояние, область действия, состояние объекта, bool isCompleted) Microsoft.AspNetCore. Mvc .Infrastructure.ResInIn | 17_1 (ResourceInvoker invoker) Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask | 6_0 (конечная точка конечной точки, задача requestTask, журнал регистрации ILogger) , Маршрутизатор IEndpointRouter, сеанс IUserSession, события IEventService) IdentityServer4.Hosting.MutualTlsTokenEndpointMiddleware.Invoke (контекст HttpContext, IAuthenticationS схемы chemeProvider). Microsoft.AspNetCore. DatabaseErrorPageMiddleware.Invoke (HttpContext httpContext) Microsoft.AspNetCore.Diagnostics. EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke (HttpContext httpContext) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext)
Показать необработанные подробности исключения System.InvalidOperationException: локальный URL-адрес не указан. URL с абсолютным путем считается локальным, если у него нет части хоста / органа. URL-адреса, использующие виртуальные пути ('~ /'), также являются локальными. в Microsoft.AspNetCore. Mvc .Infrastructure.LocalRedirectResultExecutor.ExecuteAsyn c (контекст ActionContext, результат LocalRedirectResult) в Microsoft.AspNetCore. Mvc .LocalRedirectResult.ExecuteResultAsyn c (файл ActionContext. * .Infrastructure.ResourceInvoker.g__Logged | 21_0 (ResourceInvoker invoker, результат IActionResult) в Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.g__Awaited | 29_0 [TFilter, TFilterAsync] (ResourceInvoker invok, объект State, задача последний, Состояние объекта, логическое isCompleted) в Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.Rethrow (ResultExecutedContextSealed context) в Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.ResultNext [TFilter & next, Scope, Tcope, TFilter Object & state, Boolean & isCompleted) в Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.InvokeResultFilters () --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в Micro soft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.g__Awaited | 24_0 (ResourceInvoker invoker, Task lastTask, State next, область действия области, состояние объекта, логическое значение isCompleted) в Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvource.E context) в Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted) в Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.g__Awaited | 19_0 (ResourceInvoker invocoker) lastTask, состояние следующее, область действия, состояние объекта, логическое значение isCompleted) в Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.g__Logged | 17_1 (активатор ResourceInvoker) в Microsoft.AspNetCore.Routing.EndpointMiddleware.g__Awaitpointkqu0_asA Задача requestTask, ILogger logger) в Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke (контекст HttpContext) в IdentityServer4.Hosting.IdentityServerMiddleware.Invoke (контекст HttpContext, IEndpointRou маршрутизатор ter, сеанс IUserSession, события IEventService) в IdentityServer4.Hosting.MutualTlsTokenEndpointMiddleware.Invoke (контекст HttpContext, схемы IAuthenticationSchemeProvider) в контексте Microsoft.AspNetCore.Authentication.AuthenticationMidware.InostidThereIntext () в Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.Invoke (HttpContext контекст) в Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke (HttpContext HttpContext) в Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke (HttpContext HttpContext) в Microsoft .AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext)}