2017-09-15 61 views
0

我有一個測試控制檯應用程序,我正在指向身份服務器3的本地實例以請求訪問令牌。以下代碼執行此操作並返回我的令牌(通過單個範圍"scope.test.client")。使用身份服務器3,ClaimsPrinciple即使在成功承載令牌身份驗證之後爲null

static TokenResponse GetClientToken(string clientId, string clientSecret, string[] scopes) 
    { 
     var uri = new Uri(string.Concat(ID_BASE_URI, ID_URL_TOKEN)); 

     var client = new TokenClient(
      uri.AbsoluteUri, 
      clientId, 
      clientSecret); 

     return client.RequestClientCredentialsAsync(string.Join(" ", scopes)).Result; 

然後我使用這個標記來調用一個也在本地運行的API。這需要上面得到的,它傳遞給這個方法的TokenResponse

static void CallApi(string url, TokenResponse response) 
    { 
     try 
     { 
      using (var client = new HttpClient()) 
      { 
       client.SetBearerToken(response.AccessToken); 
       Console.WriteLine(client.GetStringAsync(url).Result); 
      } 
     } 
     catch (Exception x) 
     { 
      Console.WriteLine(string.Format("Exception: {0}", x.Message)); 
     } 
    } 

的API(一個ASP.NET的WebAPI項目)使用Owin啓動類執行承載令牌認證的所有要求:

 appBuilder.Map(baseApiUrl, inner => 
     { 
      inner.UseWebApi(GlobalConfiguration.Configuration); 

      // Enforce bearer token authentication for all API requests 
      inner.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions 
      { 
       Authority = "https://identityserver/core", 
       ValidationMode = ValidationMode.ValidationEndpoint, 

       RequiredScopes = new[] { "scope.test.client" } 
      }); 
     }); 

它還確保所有API請求由自定義授權屬性處理:

GlobalConfiguration.Configuration.Filters.Add(new DefaultApiAuthorizeAttribute()); 

調試這個API,第一行中我覆蓋OnAuthorize方法(在DefaultApiAuthorizeAttribute)是這樣的:

var caller = actionContext.RequestContext.Principal as System.Security.Claims.ClaimsPrincipal; 

如果我在這條線斷,我可以看到actionContext.RequestContext.Principal總是空。但是,我可以看到((System.Web.Http.Owin.OwinHttpRequestContext)actionContext.RequestContext).Request.Headers包含一個Authorization標頭,其中帶有從我的控制檯應用程序傳遞的不記名標記。

所以它似乎是在API項目未認證令牌承載。當然,Identity Server日誌表明它在發出初始訪問令牌後根本沒有被擊中。所以我會很感激你的專家建議,說明爲什麼這可能不會發生,或者至少是關於在哪裏尋找的一些指示。

我懷疑它可能有一些做SSL。儘管Identity Server被配置爲不需要SSL並使用idsrv3test.pfx開發證書進行簽名,但兩個站點均在自簽名SSL證書下進行本地託管。我確實有另一個測試MVC web應用程序,它將身份驗證委託給本地正常工作的相同IS3實例,所以我相信我的IS3實例配置正確。

回答

1

我想象一系列可能的問題可能會產生我所描述的影響,但在我的案例中,我可以通過將診斷日誌添加到我的使用API​​中找到原因。這讓我發現問題是一場集會衝突。 Owin中間件正在尋找8.0.0.0版本的Newtonsoft.JSON程序集,但我的API(實際上運行在CMS intance之上)使用的是7.0.0.0。

對於別人誰想要快速找到答案,而不是花時間調整配置,下面是介紹如何添加這個日誌文件:https://identityserver.github.io/Documentation/docsv2/consuming/diagnostics.html

+0

好的發現。感謝您回來解釋發生了什麼。 –

1

您需要致電UseIdentityServerBearerTokenAuthentication之前你叫UseWebApi。當您設置OWIN中間件管道時,順序非常重要。

就你而言,Web API將在發送到Identity Server(如果它們完全發送)之前處理你的請求。

+0

謝謝。然而,在試圖解決這個問題時,我已經讀過,訂單很重要,因此嘗試切換此訂單。在此之前,他們按照你的建議順序,但行爲是一樣的。 – getsetcode

+0

你有沒有理由不能在你的代幣上使用本地驗證? –

+0

不確定這是什麼意思,對不起。令牌由IS3發佈,因此必須由IS3驗證正確嗎? – getsetcode

相關問題