Ядро .Net, использующее Nginx в качестве ошибки обратного прокси-сервера в Facebook. Неверный не-ASCII или контрольный символ в заголовке: 0x000D - PullRequest
0 голосов
/ 26 сентября 2019

Я запускаю .Net-Core приложение за обратным прокси-сервером ( Nginx ), когда я пытаюсь Facebook-Login Я получаю эту ошибку:

Недопустимый не-ASCII или управляющий символ в заголовке: 0x000D

в Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.ThrowInvalidHeaderCharacter(Char ch) в Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.ValidateHeaderValueCharacters (StringValues ​​& headerValues) в Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Hetp.) в Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.Microsoft.AspNetCore.Http.IHeaderDictionary.set_Item (строковый ключ, значение StringValues) в Microsoft.AspNetCore.Http.Internal.DefaultHttpResponseseringПостоянный логический) в Microsoft.AspNetCore.Http.HttpResponse.Redirect (расположение строки) в examplemvc.Startup.RemoteAuthFail (RemoteFailureContext context) в Microsoft.AspNetCore.Authentication.RemoteAuthenticationEvents.RemoteFailure (контекст RemoteFailureContext) в Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.StaticFiles.)

В моей среде разработки у меня не было проблем, потому что я не использую Nginx , поэтому я уверен, что проблема связана с некоторыми из Nginx Proxy настройки конфигурации.

Журнал доступа Nginx:

162.158.154.200 - - [28/Sep/2019:13:30:53 +0000] "GET /signin-facebook?code=AQAKt8zNTbedUb8LKnsuBZpG-eCA_77sfnic6jt_TPE36C7e46MUhFs0i_ZU29PA2qbOClyXdaz6NfA0JW5NcpF6cnLJ4Nd6b7JjGa51-YOiLvKGavUbsAjEQpIOCdQ7cXcx8dOUlyDP5oU-knAi28U-mBfbiurFUv-laYOJY1UMqRIxRrVJKaZ4LwRIHm41d8w0yky0-bOEJPhBvK0mYmBBO86drYsXnOnY-stosIfCxS82D_q0ffJoijelXJoxNOMnJP8BAq-JhtQScfnroWZXf_ilZLCBmTkvl2va-D9x9SSNM8V7cfgQgdSWO31UnA0&state=CfDJ8OVuvnVG6_9Nphg79v1prru4BxrL9c3MKwcP1buvw6zjIE7TbEk3j76UQE4WHJ2YcodUwMoe0oZwguXeJE_Xjg0WSnq00A2RoBUya2ZEGkiug92j8GhTZwrnMkWdRT6aD0tuKJbOa0_DYFcY07ol5pfxmMYswsyZumW1Z_cCHpi4ZW5yzZm4x7NZll_fCS2DJktUa9rIn-c2nhp4pn3CLuY1TnzzedHQEqQkGY3zpEgsbXXCWFVQB_Hb722FacJfgg HTTP/1.1" 500 186229 "https://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "185.108.83.170"
162.158.154.200 - - [28/Sep/2019:13:30:58 +0000] "GET / HTTP/1.1" 200 34605 "https://example.com/signin-facebook?code=AQAKt8zNTbedUb8LKnsuBZpG-eCA_77sfnic6jt_TPE36C7e46MUhFs0i_ZU29PA2qbOClyXdaz6NfA0JW5NcpF6cnLJ4Nd6b7JjGa51-YOiLvKGavUbsAjEQpIOCdQ7cXcx8dOUlyDP5oU-knAi28U-mBfbiurFUv-laYOJY1UMqRIxRrVJKaZ4LaRIHm41d8w0yky0-bOEJPhBvK0mYmBBO86drYsXnOnY-stosIfCxS82D_q0ffJoijelXJoxNOMnJP8BAq-JhtQScfnroWZXf_ilZLCBmTkvl2va-D9x9SSNM8V7cfgQgdSWO31UmA0&state=CfDJ8OVuvnVG6_9Nphg79v1prru4BxrL9c3MKwcP1buvw6zjIE7TbEk3j76UQE4WHJ2YcodUwMoe0oZzguXeJE_Xjg0WSnq00A2RoBUya2ZEGkiug92j8GhTZwrnMkWdRT6aD0tuKJbOa0_DYFcY07ol4pfxmMYswsyZumW1Z_cCHpi4ZW5yzZm4x7NZll_fCS2DJktUa9rIn-c2nhp4pn3CLuY1TnzzedHQEqQkGY3zpEgsbXXCWFVQB_Hb722FacJfgg" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "185.108.83.170"

Журнал ошибок Nginx (не уверен, что эта ошибка связана):

2019/09/28 13:30:53 [warn] 8571#8571: *3912 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/2/22/0000000222 while reading upstream, client: 162.158.154.200, server: example.com, request: "GET /signin-facebook?code=AQAKt8zNTbedUb8LKnsuBZpG-eCA_77sfnic6jt_TPE36C7e46MUhFs0i_ZU29PA2qbOClyXdaz6NfA0JW5NcpF6cnLJ4Nd6b7JjGa51-YOiLvKGavUbsAjEQpIOCdQ7cXcx8dOUlyDP5oU-knAi28U-mBfbiurFUv-laYOJY1UMqRIxRrVJKaZ4LwRIHm41d8w0yky0-bOEJPhBvK0mYmBBO86drYsXnOnY-stosIfCxS82D_q0ffJoijelXJoxNOMnJP8BAq-JhtQScfnroWZXf_ilZLCBmTkvl2va-D9x9SSNM8V7cfgQgdSWO31UmA0&state=CfDJ8OVuvnVG6_9Nphg79v1prru4BxrL9c3MKwcP1buvw6zjIE7TbEk3j76UQE4WHJ2YcodUwMoe0oZwguXeJE_Xjg0WSnq00A2RoBUya2ZEGkiug92j8GhTZwrnMkWdRT6aD0tuKJbOa0_DYFcY07ol4pfxmMYswsyZumW1Z_cCHpi4ZW5yzZm4x7NZll_fCS2DJktUa9rIn-c2nhp4pn3CLuY1TnzzedHQEqQkGY3zpEgsbXXCWFVQB_Hb722FacJfgg HTTP/1.1", upstream: "http://127.0.0.1:5000/signin-facebook?code=AQAKt8zNTbedUb8LKnsuBZpG-eCA_77sfnic6jt_TPE36C7e46MUhFs0i_ZU29PA2qbOClyXdaz6NfA0JW5NcpF6cnLJ4Nd6b7JjGa51-YOiLvKGavUbsAjEQpIOCdQ7cXcx8dOUlyDP5oU-knAi28U-mBfbiurFUv-laYOJY1UMqRIxRrVJKaZ4LwRIHm41d8w0yky0-bOEJPhBvK0mYmBBO86drYsXnOnY-stosIfCxS82D_q0ffJoijelXJoxNOMnJP8BAq-JhtQScfnroWZXf_ilZLCBmTkvl2va-D9x9SSNM8V7cfgQgdSWO31UmA0&state=CfDJ8OVuvnVG6_9Nphg79v1prru4BxrL9c3MKwcP1buvw6zjIE7TbEk3j76UQE4WHJ2YcodUwMoe0oZwguXeJE_Xjg0WSnq00A2RoBUya2ZEGkiug92j8GhTZwrnMkWdRT6aD0tuKJbOa0_DYFcY07ol4pfxmMYswsyZumW1Z_cCHpi4ZW5yzZm4x7NZll_fCS2DJktUa9rIn-c2nhp4pn3CLuY1TnzzedHQEqQkGY3zpEgsbXXCWFVQB_Hb722FacJfgg", host: "example.com", referrer: "https://example.com/"

Nginx default.conf файл:

server {
    listen        80;
    server_name   example.com *.example.com;
    location / {
        proxy_pass         http://localhost:5000/;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

Мой автозагрузка.cs:

 public class Startup
{
    private IConfiguration _config;

    public Startup(IConfiguration config)
    {
        _config = config;
    }

    private Task RemoteAuthFail(RemoteFailureContext context)
    {
        context.Response.Redirect("/Error/ErrorLogin?message=" + context.Failure.Message);
        context.HandleResponse();
        return Task.CompletedTask;
    }

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

        //https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.2
        //https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-3.0
        //https://www.nginx.com/resources/wiki/start/topics/examples/forwarded/#how-to-use-it-in-nginx
        services.Configure<ForwardedHeadersOptions>(options =>
        {
            options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
        });

        services.AddDbContext<exampleContext>(options => options.UseSqlServer(_config.GetConnectionString("DefaultConnection")));

        services.AddAuthentication(options =>
        {
            options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultSignInScheme = "Temporary";
            options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        })
          .AddFacebook(options =>
          {
              options.AppId = "2235597906716847";
              options.AppSecret = "03daeb4e1c86cecc708bd83e9da1e3af";
              options.Events.OnRemoteFailure = RemoteAuthFail;
          })
          .AddCookie(options =>
          {
              options.LoginPath = "/auth/signin";
          })
          .AddCookie("Temporary");



        services.AddMemoryCache();

        services.AddMvc()
            .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
            .AddDataAnnotationsLocalization()
            .AddRazorOptions(opt =>
            {
                opt.ViewLocationFormats.Add("/Views/{1}/Partials/{0}.cshtml");
                opt.ViewLocationFormats.Add("/Views/Shared/Partials/{0}.cshtml");
            });

        services.AddBreadcrumbs(GetType().Assembly);
        services.AddScoped<ICacheRepository, CacheRepository>();
        services.AddScoped<ILocationService, LocationService>();
        services.AddScoped<IBusinessService, BusinessService>();
        services.AddScoped<IUserService, UserService>();
        services.AddScoped<ITipService, TipService>();
        services.AddScoped<ITextService, TextService>();
        services.AddScoped<ISeoService, SeoService>();
        services.AddScoped<IImageService, ImageService>();
        services.AddScoped<ICategoryService, CategoryService>();
        services.AddScoped<ICommentService, CommentService>();
        services.AddScoped<IContactUsService, ContactUsService>();
        services.AddScoped<ISearchService, SearchService>();
        services.AddScoped<IInfoService, InfoService>();
        services.AddScoped<ILoggerService, LoggerService>();

        #region localization
        services.AddLocalization(options => options.ResourcesPath = "Resources");

        services.Configure<RequestLocalizationOptions>(options =>
            {
                var supportedCultures = new List<CultureInfo>
                        {
                            new CultureInfo("he")
                            //new CultureInfo("en"),
                            //new CultureInfo("es")
                        };

                options.DefaultRequestCulture = new RequestCulture("he");
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;
            });

        #endregion

    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        //Getting the forward headers from Nginx like we define above
        app.UseForwardedHeaders();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            // Handle unhandled errors
            app.UseExceptionHandler("/Error");
            app.UseStatusCodePagesWithReExecute("/Error/{0}");

            //keep it - not related to the error handling.
            //Cloudflare configuration for Hsts https://dash.cloudflare.com/5724a5501922a66640cf23b1b88cfee1/example.com/ssl-tls/edge-certificates
            //Uncomment this only when leaving cloudflare!
            //app.UseHsts();
        }


        #region Localization2
        var supportedCultures = new[]
        {
            new CultureInfo("he")
            //new CultureInfo("en"),
            //new CultureInfo("es")
        };

        app.UseRequestLocalization(new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture("he"),
            // Formatting numbers, dates, etc.
            SupportedCultures = supportedCultures,
            // UI strings that we have localized.
            SupportedUICultures = supportedCultures
        });

        #endregion

        //redirect site to https
        //cloudflare redirect all requests to https: https://dash.cloudflare.com/5724a55019b2a66640cf73b1b88cfee1/example.com/ssl-tls/edge-certificates
        //Uncomment this only when leaving cloudflare!
        //app.UseHttpsRedirection();


        //use wwwroot for fetching static files
        app.UseStaticFiles();


        // To configure external authentication, 
        // see: http://go.microsoft.com/fwlink/?LinkID=532715
        app.UseAuthentication();

        //Request Localization
        app.UseRequestLocalization();


        app.UseMvcWithDefaultRoute();

    }
}

1 Ответ

0 голосов
/ 30 сентября 2019

Пожалуйста, установите соответствующий набор символов в вашем файле nginx.

Вот документация http://nginx.org/en/docs/http/ngx_http_charset_module.html#charset_types

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...