Я сталкиваюсь с проблемой, чтобы установить URL перенаправления для реагирования на страницу от identityserver4 во время регистрации - PullRequest
1 голос
/ 27 февраля 2020

Я использую IdentityServer4 (3.1.1) & ASP. NET Ядро 3.1 с бритвенными страницами.

Project Sructure

Ниже приведен мой Код 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)}

Ответы [ 3 ]

1 голос
/ 28 февраля 2020

Вы можете перенаправить пользователя на Idenity Server для зарегистрированного пользователя, используя ASP. NET Идентификатор ядра, но после регистрации asp. net идентификатор ядра не будет автоматически перенаправляться на страницу вашего клиента в соответствии с URL-адресом, который вы передаете в строке запроса вы должны настроить logi c, чтобы метод register перенаправлял пользователя обратно на URL входа клиента (используйте абсолютный URL), который вы передали.

0 голосов
/ 02 марта 2020

Проблема решена с помощью Нан Ю Ответ Пожалуйста, проверьте раздел комментариев:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
    {
        returnUrl = returnUrl ?? Url.Content("/Identity/Account/Login");
        ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email };
            var result = await _userManager.CreateAsync(user, Input.Password);
            if (result.Succeeded)
            {
                _logger.LogInformation("User created a new account with password.");

                var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
                var callbackUrl = Url.Page(
                    "/Account/ConfirmEmail",
                    pageHandler: null,
                    values: new { area = "Identity", userId = user.Id, code = code },
                    protocol: Request.Scheme);

                await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                    $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

                if (_userManager.Options.SignIn.RequireConfirmedAccount)
                {
                    return RedirectToPage("RegisterConfirmation", new { email = Input.Email });
                }
                else
                {
                    // this will redirect mannually to the address where you suppose to redirect
                    return Redirect("http://localhost:3000");                      
                }
            }
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError(string.Empty, error.Description);
            }
        }

        // If we got this far, something failed, redisplay form
        return Page();
}
0 голосов
/ 27 февраля 2020

Вы должны перенаправить пользователя на https://localhost: 44306 / подключить / авторизовать , тогда, если ваши пользователи еще не зарегистрированы, он нажмет кнопку регистрации.

изменить URL этого метода 'redirectToRegister' для 'https://localhost: 44306 / connect / authorize '

...