Передача и проверка токена носителя OWIN в строке запроса в WebAPI

Краткая версия: Мне нужно передать и проверить маркер несущей OWIN в качестве параметра запроса, а не в заголовке запроса.

Как мне получить способ авторизации на основе этой строки токена?

Фон: Я хочу вызвать метод webapi для загрузки файла в виде потока (и никогда не хочу, чтобы пользователь загружал его из известного местоположения файла).

Я не могу заставить это работать, если мне также нужно установить настраиваемый заголовок запроса, то есть маркер-носитель.

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

Нужно ли фильтровать? Нужно ли мне специальное требование и т.д.? Может ли метод webapi включать "access_token" в качестве одного из параметров функции?

Ответы

Ответ 2

Для полноты здесь другое опрятное решение.

Extract:

app.Use(async (context, next) =>
{
    if (context.Request.QueryString.HasValue)
    {
        if (string.IsNullOrWhiteSpace(context.Request.Headers.Get("Authorization")))
        {
            var queryString = HttpUtility.ParseQueryString(context.Request.QueryString.Value);
            string token = queryString.Get("access_token");

            if (!string.IsNullOrWhiteSpace(token))
            {
                context.Request.Headers.Add("Authorization", new[] { string.Format("Bearer {0}", token) });
            }
        }
    }

    await next.Invoke();
});

Ответ 3

или сделайте это так

    app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
    {
        Authority = IdentityConfig.Authority,
        RequiredScopes = new[] { "api" },
        TokenProvider = new OAuthBearerAuthenticationProvider
        {
            OnRequestToken = ctx =>
            {
                if (String.IsNullOrWhiteSpace(ctx.Token) && ctx.Request.QueryString.HasValue)
                {
                    NameValueCollection parsedQuery = HttpUtility.ParseQueryString(ctx.Request.QueryString.Value);
                    ctx.Token = parsedQuery["access_token"];
                }

                return Task.FromResult(0);
            }
        }
    });