ASP. NET Core 2.2 Аутентификация не работает после развертывания приложения - Nginx с несколькими приложениями - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь развернуть свое приложение на нашем внутреннем сервере с Nginx. Это ASP. NET Core 2.2 Razor Pages. Меня попросили включить некоторую аутентификацию для целей регистрации. В конце концов все работало нормально на моем компьютере. Я использовал этот сайт для добавления аутентификации на основе cook ie: https://www.mikesdotnetting.com/article/335/simple-authentication-in-razor-pages-without-a-database

Я сделал несколько модификаций для обработки еще нескольких пользователей в рамках метода OnPost(). Хотя я не думаю, что это было бы проблемой.

Возможно, важно упомянуть, что это не единственное. net основное приложение, работающее на сервере. Настройка аналогична следующей:

app1: our.domain.com

app2: our.domain.com/app2 (с этим у меня проблемы)

все работает правильно, кроме входа в систему. Когда я пытаюсь войти в систему, если пароль и имя пользователя введены правильно, он перенаправляется на соответствующую страницу, однако создается впечатление, что идентификатора нет или он не может найти его впоследствии.

При первой попытке я обнаружил следующую ошибку в журнале службы kestrel:

fail: Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery[7]

Я могу сделать так, чтобы это исчезло с помощью services.AddDataProtection(), но проблема остается той же, Я получаю перенаправление - или получаю сообщение об ошибке, если попытка входа неверна - но все равно не могу получить доступ к авторизованной папке и, например, HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.GivenName)?.Value возвращает пустое или пустое значение.

Я сделал быструю проверку и добавил та же страница входа в систему и авторизованная папка, и другие зависимости от другого приложения. И там это работает. Я даже не включил services.AddDataProtection() в файл startup.cs. Логин работает отлично. Хотя он использует. net core 2.1.

Так что, возможно, придется что-то делать с рутированием? Или я не знаю. Я полностью потерян. Я не полностью занятый разработчик, больше как любитель, и я полностью застрял в этот момент. Может я что-то напутал в файле startup.cs? Или я должен добавить что-то еще? Или это что-то с обработкой файлов cookie? Я действительно много искал, пока не повезло.

Вот соответствующая часть моего startup.cs:

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {

            services.AddEntityFrameworkNpgsql()
                .AddDbContext<Models.UserAccessDbContext>(options =>
                    options.UseNpgsql(Configuration.GetConnectionString("appConnection")))
                .BuildServiceProvider();


            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            // https://hanselman.com/blog/DealingWithApplicationBaseURLsAndRazorLinkGenerationWhileHostingASPNETWebAppsBehindReverseProxies.aspx
            services.Configure<ForwardedHeadersOptions>(options =>
            {
                options.ForwardedHeaders = ForwardedHeaders.All;
                options.AllowedHosts = Configuration.GetValue<string>("AllowedHosts")?.Split(';').ToList<string>();
            });


            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(cookieOptions =>
            {
                cookieOptions.LoginPath = "/";
            });

            services.AddMvc().AddRazorPagesOptions(options =>
            {
                options.Conventions.AuthorizeFolder("/admin");
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);


            services.AddDataProtection()
                .SetApplicationName("app")
                .PersistKeysToFileSystem(new DirectoryInfo(@"/var/dpkeys/"));


        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {


            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            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.Use((context, next) =>
                {
                    context.Request.PathBase = new PathString("/app");
                    return next.Invoke();
                });
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();


            app.UseAuthentication();

            app.UseMvc();
        }

Обновление: одна маленькая деталь. Повар ie создан, и я вижу его в инспекторе Chrome. Но сайт / приложение не видит меня как аутентифицированного пользователя.

1 Ответ

0 голосов
/ 20 апреля 2020

Кажется, у меня были проблемы с настройками cook ie. Еще одно различие между двумя страницами, если оно использует font-awesome, это означает, что у меня есть некоторые внешние куки на моем сайте. Как дикое предположение, сначала я установил

options.MinimumSameSitePolicy = SameSiteMode.Lax;

, так как другие куки имели этот режим.

И точно так же он начал работать и на хост-сервере! Теперь приложение распознает повара ie, созданного после входа в систему.

...