Ответ 1
Я писал о том, как это работает здесь: http://leastprivilege.com/2013/10/31/retrieving-bearer-tokens-from-alternative-locations-in-katanaowin/
Краткая версия: Мне нужно передать и проверить маркер несущей OWIN в качестве параметра запроса, а не в заголовке запроса.
Как мне получить способ авторизации на основе этой строки токена?
Фон: Я хочу вызвать метод webapi для загрузки файла в виде потока (и никогда не хочу, чтобы пользователь загружал его из известного местоположения файла).
Я не могу заставить это работать, если мне также нужно установить настраиваемый заголовок запроса, то есть маркер-носитель.
Я должен иметь возможность передать токен в строке запроса, но не знаю, как получить этот токен, чтобы затем аутентифицировать пользователя.
Нужно ли фильтровать? Нужно ли мне специальное требование и т.д.? Может ли метод webapi включать "access_token" в качестве одного из параметров функции?
Я писал о том, как это работает здесь: http://leastprivilege.com/2013/10/31/retrieving-bearer-tokens-from-alternative-locations-in-katanaowin/
Для полноты здесь другое опрятное решение.
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();
});
или сделайте это так
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);
}
}
});