简短版本: 我需要传递并验证OWIN方位标记作为查询参数而不是请求标头。
如何根据该令牌字符串获取授权方法?
背景: 我想调用webapi方法将文件作为流下载(并且永远不希望用户从已知的文件位置下载它)。
如果我还需要设置自定义Request标头,即承载令牌,我无法使用。
我应该能够在查询字符串中传递令牌 - 但是不知道如何获取该令牌然后对用户进行身份验证。
我需要过滤吗?我需要特殊索赔吗? webapi方法是否需要包含“access_token”作为函数参数之一?
答案 0 :(得分:21)
为了完整性,here's另一个简洁的解决方案。
提取物:
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();
});
答案 1 :(得分:8)
我在这里写了关于它是如何工作的: http://leastprivilege.com/2013/10/31/retrieving-bearer-tokens-from-alternative-locations-in-katanaowin/
答案 2 :(得分:2)
或者像这样做
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);
}
}
});