Добавьте заголовок авторизации в HttpContext в MVC .Net Core Mvc 21 - PullRequest
0 голосов
/ 31 августа 2018

У меня есть токен на предъявителя Jwt, который я храню в сеансе в моем приложении .Net Core 2.1. В моем промежуточном программном обеспечении я перехватываю запрос и прикрепляю токен к заголовкам:

httpContext.Request.Headers.Add("Authorization", $"Bearer {token}");

В настоящее время это не работает, поскольку я получаю несанкционированный доступ к защищенному маршруту. Если я сделаю тот же вызов, используя почтальон и передавая токен Авторизации и Носителя в заголовках, это сработает.

Что мне нужно изменить на http.Request, чтобы сделать его приемлемым?

Часть запуска с Jwt: var signatureKey = key;

        services.AddSingleton<IJwtFactory, JwtFactory>();

        var jwtAppSettingOptions = Configuration.GetSection(nameof(JwtIssuerOptions));

        // Configure JwtIssuerOptions
        services.Configure<JwtIssuerOptions>(options =>
        {
            options.Issuer = Issuer;
            options.Audience = Audience;
            options.SigningCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
        });

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
            .AddJwtBearer(options =>
            {
                options.RequireHttpsMetadata = false;
                options.SaveToken = true;
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidIssuer = Issuer,

                    ValidateAudience = true,
                    ValidAudience = Audience,

                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = signingKey,

                    RequireExpirationTime = false,
                    ValidateLifetime = true,
                    ClockSkew = TimeSpan.Zero
                };
            })
            .AddCookie(cfg => cfg.SlidingExpiration = true);

Настройка:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
    {
        app.UseAuthentication();
        app.UseStaticFiles();
        app.UseSession();
        app.UseHttpContextLogging();
        app.ConfigureErrorHandling(env);
        app.UseSiteRouteMiddleware(getRoutes); -- Middleware that intercepts the request, adding the token here
        app.UseRequestLocalization();
        app.UseRewriter();
        app.UseMvc(getRoutes);
    }

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018
app.UseAuthentication();

Это то, что регистрирует промежуточное ПО аутентификации, которое в конечном итоге будет искать токен JWT Bearer во входящем HTTP-запросе и которое будет использовать его для аутентификации пользователя на основе этого значения.

Поскольку это промежуточное программное обеспечение является зарегистрированным первым промежуточным программным обеспечением, оно также будет работать в качестве первого промежуточного программного обеспечения, прежде чем что-либо еще в вашем конвейере будет запущено. Поскольку вызов app.UseSiteRouteMiddleware() происходит позже, ваше пользовательское промежуточное ПО, которое будет изменять входящий HTTP-запрос, также будет запущено позже. Таким образом, он изменит запрос после того, как он уже был использован в целях аутентификации.

Если вы хотите, чтобы аутентификация происходила после возможности переписать HTTP-запрос, вам придется переместить app.UseSiteRouteMiddleware() перед вызовом app.UseAuthentication().

Обратите внимание, что поскольку ваше пользовательское промежуточное ПО использует сеанс, промежуточное программное обеспечение сеанса также должно запускаться раньше, чем ваше пользовательское промежуточное ПО. В конце концов, ваш поток должен работать так:

  1. Получение информации о сеансе (промежуточное программное обеспечение сеанса)
  2. Настройка заголовков HTTP-запросов (SiteRouteMiddleware)
  3. Аутентификация пользователя (промежуточное ПО аутентификации)

Итак, вы должны настроить эти три промежуточных программного обеспечения в следующем порядке:

app.UseSession();
app.UseSiteRouteMiddleware(getRoutes);
app.UseAuthentication();

При этом, ваш подход к хранению JWT довольно неконвенален . Обычно предполагается, что аутентификация с использованием токена-носителя не имеет состояния, поскольку клиент явно передает токен, необходимый для аутентификации пользователя. Это отличается от обычной аутентификации на основе файлов cookie, когда данные неявно передаются через файл cookie в рамках запроса.

По иронии судьбы, вы используете промежуточное программное обеспечение сеанса для хранения токена-носителя JWT, что делает именно это: по умолчанию промежуточное программное обеспечение сеанса использует сеанс cookie для возобновления предыдущего сеанса пользователя. Итак, с вашим решением вы в основном использовали другой файл cookie для включения аутентификации.

Если у вас нет действительно веской причины для такого дизайна, я настоятельно рекомендую вам переключиться на стандартную проверку подлинности с использованием cookie, которая будет просто хранить идентификационные данные в cookie, а не сохранять их в веб-токене JSON. Это, вероятно, также, как правило, уменьшает сложность вашей настройки аутентификации, делая ее намного лучше поддерживаемой. В то же время вы также потеряете требование использовать дополнительное управление сеансами, которое часто рекомендуется (опять же, если у вас нет веских причин).

Если вам нужна «обычная» аутентификация на носителе JWT, например, если к вашему приложению также обращается клиент API, то обратите внимание, что нет ничего плохого в том, что в аутентификации на носителе JWT и есть ваше приложение. Таким образом, у вас есть свобода выбора любого стиля аутентификации, который лучше всего подходит для каждого случая.

0 голосов
/ 31 августа 2018

Как написано в комментариях, к тому времени, когда ваш UseSiteRouteMiddleware вызывается, промежуточное ПО аутентификации уже обработано.

Так что поздно что-либо устанавливать. Измените порядок выполнения промежуточного программного обеспечения. Поместите UseSiteRouteMiddleware ближе к началу, до UseAuthentcation().

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

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

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