2014-02-21 53 views
14

簡短版本: 我需要傳遞和驗證OWIN承載令牌作爲查詢參數而不是請求頭。在WebAPI的查詢字符串中傳遞和驗證OWIN不記名令牌

那麼我該如何根據該標記字符串獲取授權方法?

背景: 我想調用webapi方法將文件下載爲流(並且永遠不希望用戶從已知文件位置下載文件)。

如果我還需要設置自定義請求標頭,即不記名標記,我無法使其工作。

我應該能夠在查詢字符串中傳遞令牌 - 但不知道如何獲取該令牌然後驗證用戶身份。

我需要過濾嗎?我需要特殊的聲明等嗎? webapi方法是否需要包含「access_token」作爲函數參數之一?

回答

19

爲了完整起見,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(); 
}); 
+3

完美的感謝,我把它包裝在IAppBuilder的自己的擴展方法中:public static void UseQueryStringAuthentication(這個IAppBuilder應用程序),以便我可以遵循與app.UseQueryStringAuthentication()相同的做法。還值得一提的是,當我們攔截這個調用時,我們必須在調用身份驗證機制之前將其放入管道中。所以我把它作爲我的Startup.Auth文件中的第一項。 –

+1

這個必須在調用app.UseOAuthBearerTokens之前出現 – Carl

+0

Yeap,非常重要的是這是在app.UseOAuthBearerTokens(OAuthOptions)命令 – Catinodeh

1

或做這樣的

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