Попытка ввести заголовок авторизации с помощью OWIN до того, как авторизация произойдет в ASP.net Web API - PullRequest
0 голосов
/ 08 мая 2019

Я использую Owin для аутентификации JWT.Все мои запросы возвращаются как «401 Unauthorized».

Я пытаюсь перехватить все запросы к моему веб-приложению, чтобы я мог получить токен JWT из cookie.

Добавление авторизацииЗаголовок с токеном на предъявителя работает и правильно авторизуется.

Промежуточное программное обеспечение срабатывает при каждом запросе, успешно захватывает cookie и успешно обновляет заголовок (в объекте контекста).


        public void Configuration(IAppBuilder app)
        {
            app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
            {
                TokenValidationParameters = new TokenValidationParameters
                {
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecret)),

                    ValidateLifetime = true
                }
            });

            app.Use(typeof(JWTMiddleware));

            var config = new HttpConfiguration();
            WebApiConfig.Register(config);

            app.UseWebApi(config);
        }


    public class JWTMiddleware: OwinMiddleware
    {
        public JWTMiddleware(OwinMiddleware next): base(next)
        {
        }

        public override async Task Invoke(IOwinContext context)
        {
            var name = "auth";
            var cookie = context.Request.Cookies[name];
            if (cookie != null)
            {
                if (string.IsNullOrEmpty(context.Request.Headers.Get("Authorization")))
                {
                    context.Request.Headers.Append("Authorization", "Bearer " + cookie);
                }
            }
            await Next.Invoke(context);
        }
    }

Идеальный рабочий процесс:

  1. Cookie (который содержит JWT) отправляется с запросом

  2. Промежуточное программное обеспечение Owin перехватывает это, извлекает токен из cookie и добавляет заголовок авторизации

  3. API-вызов аутентифицируется с заголовком носителя авторизации.

Если кому-то любопытно, почему я это делаю ... так, чтобы мой веб-сайт мог использовать куки-файлы только для http для хранения токена, а затем с устройств, где нужен токен на предъявителя, я могу просто отправить этовместо этого.

Вместо этого я просто всегда получаю 401 несанкционированный.Я подозреваю, что он пытается аутентифицировать токен до того, как его перехватит Овин?Я не уверен.

1 Ответ

1 голос
/ 16 мая 2019

Мне кажется, я решил это.Это была проблема, состоящая из двух частей.

В моих файлах Startup.cs этот фрагмент кода

                TokenValidationParameters = new TokenValidationParameters
                {
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecret)),

                    ValidateLifetime = true
                }
            });

вел Оуэна всегда возвращать токен как несанкционированный.Должно быть, я изменил это в какой-то момент и никогда не перепроверял.Я проверил ValidIssuer и ValidAudience, и мы снова в порядке.

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

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