2015-10-29 44 views
2

我正在使用Visual Studio 2015 Enterprise和ASP.NET vNext Beta8構建端點,該端點既按所述方式發佈和使用JWT標記詳細地說here。正如該文章中所解釋的,端點使用AspNet.Security.OpenIdConnect.Server(AKA OIDC)來完成繁重的工作。混合http/https環境中的AspNet.Security.OpenIdConnect.Server(ASP.NET vNext)權威配置

在我們的內部開發環境中使用該原型時,我們遇到了使用負載平衡器的問題。特別是,我們認爲它與app.UseJwtBearerAuthentication的「權限」設置以及我們特有的http/https組合有關。隨着我們的負載均衡的環境中,任何試圖調用使用該令牌的REST方法產生此異常:

引發WebException:遠程名稱不能被解析:devapi.contoso.com.well知名' HttpRequestException:發送請求時發生錯誤。
IOException:IDX10804:無法從:'https://devapi.contoso.com.well-known/openid-configuration'檢索文檔。


考慮以下的步驟來重現(這是爲原型,不應該被認爲是生產價值):

  • 我們創造了使用OIDC描述here一個beta8原型。

  • 我們將該項目部署到運行在Server 2012 R2上的2個相同配置的IIS 8.5服務器。 IIS服務器託管一個名爲「API」的beta8站點,並在端口80和443上綁定主機名「devapi.contoso.com」(針對本文的目的進行了消毒處理)所有可用的IP地址。

  • 兩個IIS服務器有一個主機條目指向自己:

    127.0.0.1 devapi.contoso.com

  • 我們的網絡管理員已經綁定一個*證書(爲* .contoso.com)與我們的Kemp負載均衡器,並將https://devapi.contoso.com的DNS條目配置爲解析爲負載均衡器。

  • 現在,這是很重要的,負載均衡器也被配置成代理HTTPS流量使用HTTP,重複,對HTTPS不)的IIS服務器。我向他解釋說,這是我們公司的標準操作程序,因爲他們只需要在一個地方安裝證書。 我們不確定我們的網絡管理員爲什麼會在IIS中綁定443,因爲理論上它從未在此端口上收到任何流量。

  • 我們使通過HTTPS安全崗位https://devapi.contoso.com/authorize/v1獲取一個令牌,它工作正常(如何使這個職位的細節here):

    {
    「子」:「待辦事項」 ,
    「ISS」: 「https://devapi.contoso.com/
    「AUD」: 「https://devapi.contoso.com/
    「EXP」:1446158373,
    「NBF」:1446154773
    }

  • 然後,我們在另一個安全獲取通過https使用此令牌到https://devapi.contoso.com/values/v1/5

  • OpenIdConnect.OpenIdConnectConfigurationRetriever拋出該異常:

引發WebException:遠程名稱不能被解析:devapi.contoso.com.well知名' HttpRequestException:在發送時發生錯誤請求。
IOException:IDX10804:無法從:'https://devapi.contoso.com.well-known/openid-configuration'檢索文檔。


我們認爲這是發生,因爲OIDC試圖進行磋商,「options.Authority」指定的主機,我們設置在啓動時https://devapi.contoso.com/。此外,我們推測,因爲我們的環境已配置爲將https流量轉換爲負載均衡器和IIS之間的非https流量,所以當框架嘗試解析https://devapi.contoso.com/時,出現問題。我們已經嘗試了許多配置更改,包括甚至將權限指向不安全的http://devapi.contoso.com也無濟於事。

任何幫助我們理解這個問題的幫助將不勝感激。

+0

'https:// devapi.contoso.com.well-known/openid-configuration'似乎沒有正確形成(域名丟失後的斜線)。如果您使用'options.ConfigurationManager'解決方法來使元數據請求與非HTTPS端點一起工作,請確保您的'Authority'以結尾斜槓結尾。如果它不起作用,可以在'.well-known/openid-configuration'之前手動添加一個斜線。 – Pinpoint

回答

1

@Pinpoint是對的。此異常是由允許IdentityModel啓動非HTTPS調用的OIDC配置代碼路徑引起的。特別是我們使用的代碼示例對缺少權限URI中的尾部斜槓非常敏感。下面是一個使用開放的類路徑,以可靠的方式相結合,無論管理局URI是否有尾隨斜線代碼片段:

public void Configure(IApplicationBuilder app, IOptions<AppSettings> appSettings) 
{ 
    . 
    . 
    . 
    // Add a new middleware validating access tokens issued by the OIDC server. 
    app.UseJwtBearerAuthentication 
    (
     options => 
     { 
      options.AuthenticationScheme = JwtBearerDefaults.AuthenticationScheme    ; 
      options.AutomaticAuthentication = false             ; 
      options.Authority    = new Uri(appSettings.Value.AuthAuthority).ToString() ; 
      options.Audience    = new Uri(appSettings.Value.AuthAuthority).ToString() ; 

      // Allow IdentityModel to use HTTP 
      options.ConfigurationManager = 
       new ConfigurationManager<OpenIdConnectConfiguration> 
       (
        metadataAddress : new Uri(new Uri(options.Authority), ".well-known/openid-configuration").ToString(), 
        configRetriever : new OpenIdConnectConfigurationRetriever()           , 
        docRetriever : new HttpDocumentRetriever { RequireHttps = false } 
       ); 
     } 
    ); 
    . 
    . 
    . 
} 

在這個例子中,我們管理局URI從配置拉動。 json通過「appSettings.Value.AuthAuthority」,然後使用Uri類進行消毒/組合。

+0

不要猶豫,將自己的答案標記爲已接受的答案。請注意,通過將'options.RequireHttpsMetadata'設置爲'false',現在有一種更簡單的方法可以允許RC1中的非HTTPS元數據調用。 – Pinpoint