मैं अपने एप्लिकेशन को Nginx के साथ हमारे आंतरिक सर्वर पर तैनात करने का प्रयास कर रहा हूं। यह एक ASP.NET Core 2.2 रेजर पेज साइट है। मुझे लॉगिंग उद्देश्यों के लिए कुछ प्रमाणीकरण शामिल करने के लिए कहा गया था। आखिरकार मेरे कंप्यूटर पर सब कुछ ठीक चल रहा था। कुकी आधारित प्रमाणीकरण जोड़ने के लिए मैंने इस साइट का उपयोग किया: https://www.mikesdotnetting. com/लेख/335/सरल-प्रमाणीकरण-इन-रेज़र-पेज-बिना-ए-डेटाबेस

मैंने OnPost() पद्धति में कुछ और उपयोगकर्ताओं को संभालने के लिए कुछ संशोधन किए। हालांकि मुझे नहीं लगता कि यह समस्या होगी।

यह उल्लेख करना महत्वपूर्ण हो सकता है कि यह सर्वर पर चलने वाला एकमात्र .net कोर ऐप नहीं है। सेटअप इस के समान है:

App1: our.domain.com

App2: our.domain.com/app2 (यह वह है जिसमें मुझे समस्या है)

लॉगिन को छोड़कर सब कुछ ठीक से काम करता है। जब मैं लॉग इन करने का प्रयास करता हूं, यदि पासवर्ड और उपयोगकर्ता नाम सही है तो यह उचित पृष्ठ पर पुनर्निर्देशित हो जाता है, हालांकि ऐसा लगता है कि कोई पहचान नहीं है या इसे बाद में नहीं मिल सकता है।

अपने पहले प्रयास में, मुझे केस्ट्रल सेवा लॉग में निम्न त्रुटि मिली:

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

मैं services.AddDataProtection() का उपयोग करके इसे गायब कर सकता हूं, हालांकि समस्या अभी भी वही है, मुझे रीडायरेक्ट किया जाता है - या लॉगिन प्रयास गलत होने पर त्रुटि संदेश प्राप्त होता है - लेकिन फिर भी अधिकृत फ़ोल्डर तक नहीं पहुंच सकता है और उदा। HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.GivenName)?.Value शून्य या खाली लौटाता है।

मैंने एक त्वरित परीक्षण किया और उसी लॉगिन पृष्ठ और एक अधिकृत फ़ोल्डर, और अन्य निर्भरताओं को दूसरे ऐप में जोड़ा। और वहां यह काम करता है। मैंने services.AddDataProtection() को start.cs में भी शामिल नहीं किया। लॉगिन पूरी तरह से काम करता है। हालांकि यह .net कोर 2.1 का उपयोग कर रहा है।

तो इसे rooting के साथ कुछ करना पड़ सकता है? या मुझे नहीं पता। मैं पूरी तरह से खो गया हूँ। मैं एक पूर्णकालिक डेवलपर नहीं हूं, एक शौकिया की तरह अधिक हूं और मैं इस समय पूरी तरह से फंस गया हूं। शायद मैंने स्टार्टअप.सीएस में कुछ गड़बड़ कर दी है? या मुझे कुछ और जोड़ना चाहिए? या यह कुकीज़ से निपटने के साथ कुछ है? मैंने बहुत खोज की, अब तक कोई किस्मत नहीं।

मेरे स्टार्टअप.सीएस का प्रासंगिक हिस्सा यहां दिया गया है:

        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();
        }

अद्यतन: एक छोटा विवरण। कुकी बनाई गई है और मैं इसे क्रोम के इंस्पेक्टर के भीतर देख सकता हूं। लेकिन साइट/ऐप मुझे एक प्रमाणित उपयोगकर्ता के रूप में नहीं देखता है।

0
ebanyai 14 अप्रैल 2020, 15:54

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा लगता है कि मुझे कुकी सेटिंग्स में समस्या थी। दो पृष्ठों के बीच एक और अंतर यह है कि यदि यह font-awesome का उपयोग करता है, जिसका अर्थ है कि मेरी साइट पर कुछ बाहरी कुकीज़ हैं। एक जंगली अनुमान के रूप में, पहले मैंने सेट किया

options.MinimumSameSitePolicy = SameSiteMode.Lax;

चूंकि अन्य कुकीज़ में वह मोड था।

और ठीक वैसे ही यह होस्टिंग सर्वर पर भी काम करने लगा! अब ऐप लॉग इन के बाद बनाई गई कुकी को पहचान लेता है।

0
ebanyai 20 अप्रैल 2020, 07:53