Включить cookie из заголовков ответов в заголовки запросов - PullRequest
0 голосов
/ 27 сентября 2019

Я использую несколько экземпляров приложения .NET Core за обратным прокси-сервером Traefik.Когда пользователь посещает веб-сайт, Traefik отправляет обратно StickyCookie (внутри Set-Cookie):

enter image description here

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

Как я могу внедрить промежуточное ПО в .NET Core, которое будет добавлять поле StickyCookie к каждому запросу?Он должен включать тот же StickyCookie, который был получен из предыдущего ответа.

По сути, я хочу добиться того же, что и следующая команда Linux:

curl -v --cookie "StickyCookie=http://10.0.2.75:80" http://example.com:5000

Ответы [ 2 ]

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

Вы можете получить StickyCookie в заголовке ответа в промежуточном программном обеспечении и затем сохранить его в Session , затем вы можете извлечь данные из сеанса и добавить их в заголовок запроса.

public class AddHeaderMiddleware
{
    private readonly RequestDelegate _next;

    public AddHeaderMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {

        var data = context.Session.GetString("StickyCookie");

        context.Request.Headers.Add("StickyCookie", data);

        context.Response.OnStarting(state =>
        {
            var httpContext = (HttpContext)state;
            var cookies = httpContext.Response.Headers["Set-Cookie"].ToString().Split(";");
            if (cookies.Length > 0)
            {
                foreach (var item in cookies)
                {
                    if (item.Split("=")[0] == "StickyCookie")
                    {
                        var cookie = item.Split("=")[1];
                        httpContext.Session.SetString("StickyCookie", cookie);
                    }
                }
            }
            return Task.FromResult(0);
        }, context);

        await _next(context);
    }
}

public static class AddHeaderMiddlewareExtensions
{
    public static IApplicationBuilder UseAddHeader(
        this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<AddHeaderMiddleware>();
    }
}

In Startup.cs

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddDistributedMemoryCache();

        services.AddSession(options =>
        {
            //// Set a short timeout for easy testing.
            //options.IdleTimeout = TimeSpan.FromMinutes(10);
            //options.Cookie.HttpOnly = true;
            //// Make the session cookie essential
            options.Cookie.IsEssential = true;
        });
 }
public void Configure(IApplicationBuilder app)
{
     //...
     app.UseSession();
     app.UseAddHeader();
     //...
}

Действие для проверки:

var header = HttpContext.Request.Headers;
0 голосов
/ 27 сентября 2019

Промежуточное программное обеспечение может быть зарегистрировано для отправки чего-либо в заголовок ответа.Вы можете зарегистрировать промежуточное программное обеспечение в файле startup.cs. Метод настройки:

  app.UseMiddleware<CustomHeader>();

И тогда ваш класс CustomHeader может быть

using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace PEG.Api.Middleware
{
    public class CustomHeader
    {
        private readonly RequestDelegate _next;

        public CustomHeader(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            //you can add your stickyCookie in the dictionary
            var dictionary = new Dictionary<string, string[]>()
            {
                /* add your sticky cookie here. An example below
                 {
                    "Access-Control-Allow-Credentials",new string[]{"true" }
                }*/
            };

            //To add Headers AFTER everything you need to do this
            context.Response.OnStarting(state => {
                var httpContext = (HttpContext)state;
                foreach (var item in dictionary)
                {
                    httpContext.Response.Headers.Add(item.Key, item.Value);
                }
                return Task.FromResult(0);
            }, context);

            await _next(context);
        }
    }
}
...