在 WebAPI 的查询字符串中传递和验证 OWIN 持有者令牌



简短版本:我需要将 OWIN 轴承令牌作为查询参数传递并验证,而不是在请求标头中。

然后,如何根据该令牌字符串使方法获得授权?

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

如果我还需要设置自定义请求标头(即持有者令牌),我无法让它工作。

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

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

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

提取:

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();
});

我在这里写了关于它是如何工作的:http://leastprivilege.com/2013/10/31/retrieving-bearer-tokens-from-alternative-locations-in-katanaowin/

或者这样做

    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);
            }
        }
    });

最新更新