Запрос CORS с GET работает, но POST не работает - ASP .NET CORE и использование JWT Auth - PullRequest
0 голосов
/ 02 января 2019

если я делаю GET-запрос, он работает просто отлично, однако POST-запрос не работает. Я искал несколько часов и не могу понять, в основном каждое предложение, которое я видел, я уже попробовал.

Вот моя Configure функция:

// 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()) //Remember to switch launchSettings.json to 'Production'
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();

        if (IsDebug) //Allows testing by using a frontend at localhost:8080 - Configure the port to your frontend port.
        {
            app.UseCors(builder => builder
                .WithOrigins("http://localhost:8080")
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials()
            );                  
        }
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

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

    app.UseMvc(routes =>
    {
        routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
        routes.MapRoute("Error", "{*url}", new { controller = "Home", action = "Index" });
    });

}

Я регистрирую промежуточное программное обеспечение CORS раньше других.

Для методов, которые я пытаюсь вызвать, я поместил [Authorize] в класс и [HttpPost] в методы. Если я переключу его на [HttpGet], он будет работать.

Вот пример того, как я называю мой API:

var headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + jwtToken
}

// Don't burden the server with unnecessary calls to the API if we don't even have a token.
if (jwtToken) {
    var result = await axios.post('https://localhost:44377/api/Playground/GetMenuItems', { headers: headers } );
    if (result.data === -1) { throw -1 }    
    return result.data;
}

Вот так выглядят мои сетевые инструменты:

enter image description here

Я полагаю, что первый - предварительный просмотр, поскольку метод запроса - OPTIONS, и он возвращает 204:

enter image description here

Вот неудачный запрос POST, с ошибкой 401:

enter image description here

Обратите внимание, что токен на предъявителя не отправляется в запросе. Однако он отправляется в полезной нагрузке запроса.

Я абсолютно почесал свою голову здесь, я был бы очень признателен, если бы у кого-то было понимание!

Приветствие.

P.S. Вот моя ConfigureServices функция:

public void ConfigureServices(IServiceCollection services)
{
    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;
    });

    services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(ConnectionString));
    services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>();


    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); // => remove default claims
    services
    .AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

    })
    .AddJwtBearer(cfg =>
    {
        cfg.RequireHttpsMetadata = false;
        cfg.SaveToken = true;
        cfg.TokenValidationParameters = new TokenValidationParameters
        {
            ValidIssuer = Configuration["JwtIssuer"],
            ValidAudience = Configuration["JwtIssuer"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtKey"])),
            ClockSkew = TimeSpan.Zero // remove delay of token when expire
        };
    });


    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);


    if (IsDevelopment)
    {
        IsDebug = Configuration.GetValue<bool>("DEBUGGING");
        if (IsDebug)
        {
            services.AddCors(); //Dangerous in prod.
        }

        _connectionString = Configuration["PlaygroundConnectionString"];
    }
    else
    {
        // Get prod secrets
    }

}

1 Ответ

0 голосов
/ 02 января 2019

Axios.post требуется 3 параметра - вы предоставляете только два. И второй параметр - это объект data для отправки в качестве тела команды post, который объясняет, почему ваши заголовки отправляются в теле.

Из документации axios :

axios.post (url [, data [, config]])

Попробуйте изменить код на

var result = await axios.post('https://localhost:44377/api/Playground/GetMenuItems', null, { headers: headers } );

Команде Axios.get требуется только 2 параметра, поэтому этот параметр работает.

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