在WebAPI中的查询字符串中传递和验证OWIN承载令牌

Bro*_*enZ 15 asp.net-web-api owin

简短版本:我需要传递并验证OWIN方位标记作为查询参数而不是请求标头.

然后,我如何根据该标记字符串获取授权方法?

背景:我想调用webapi方法将文件作为流下载(并且永远不希望用户从已知文件位置下载它).

如果我还需要设置自定义Request标头,即承载令牌,我无法使其工作.

我应该能够在查询字符串中传递令牌 - 但不知道如何获取该令牌然后对用户进行身份验证.

我需要过滤吗?我需要特殊索赔吗?webapi方法是否需要包含"access_token"作为函数参数之一?

Dun*_*unc 22

为了完整起见,这是另一个简洁的解决方案.

提取:

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();
});
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,我把它包装在我自己的IAppBuilder扩展方法中:public static void UseQueryStringAuthentication(这个IAppBuilder应用程序),这样我就可以遵循与app.UseQueryStringAuthentication()相同的做法.值得一提的是,当我们拦截调用时,我们必须在调用身份验证机制之前将其置于管道中.所以我把它作为我的Startup.Auth文件中的第一项. (3认同)