2017-09-26 47 views
1

我一直在設置一個OpenIdDict authserver,用於我們現有的mvc core 2.0 web應用程序。我在使用代碼流並在我們的生產應用程序上實現OpenIdConnect部分之前,先測試了mvc webapp資源服務器。OpenIddict MVC核心2.0和資源服務器上的JWT API

一切似乎都按預期工作,我可以登錄並訪問我的資源。

我需要在新的身份驗證架構下爲我的其他客戶端獲取api承載身份驗證。 Api被放置在相同的資源服務器上。

我一直在使用設置了我的OpenIddict爲JWT:

  options.AllowPasswordFlow(); 
      options.UseJsonWebTokens(); 
      options.AddSigningKey(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value))); 

...添加JwtBearer

 JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 
     JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear(); 

     services.AddAuthentication() 
      .AddJwtBearer(options => 
      { 
       options.Authority = "http://localhost:17004/"; 
       options.Audience = "MyAudience"; 
       options.RequireHttpsMetadata = false; 
       options.TokenValidationParameters = new TokenValidationParameters 
       { 
        NameClaimType = OpenIdConnectConstants.Claims.Subject, 
        RoleClaimType = OpenIdConnectConstants.Claims.Role, 
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value)) 
       }; 
      }); 

...在AuthorizationController.Exchange添加的代碼來處理口令流令牌的請求。

在我的資源服務器Startup.cs中,我添加了AddOpenIdConnect並添加了簽名密鑰(與我的auth服務器上的密鑰相同)。

  options.ResponseType = OpenIdConnectResponseType.Code; 
      options.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet; 
      options.TokenValidationParameters = new TokenValidationParameters() 
      { 
       IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value)) 
      }; 
      options.Authority = "http://localhost:17004/"; 

試圖訪問的資源服務器上我的API時,這一設置我的資源服務器仍然可以進行身份​​驗證和一切工作,我可以使用RESTClient實現,以獲得我的身份驗證服務器JWT令牌之後卻失敗,因爲有對承載方案不是驗證者。

如果我在TokenValidationParameters中使用相同的簽名密鑰添加了在資源服務器上調用AddBearerToken的調用,它實際上可以工作。挑戰是成功的,我可以獲得我的資源。

但是我懷疑我的設置遠沒有改正,因爲我可以看到,當調用我的api時,我的令牌驗證發生在資源服務器上,所以我剩下兩個問題。

  1. 是否有可能讓JwtBearer中間件將驗證轉發給我的auth服務器? (可以openidConnect處理它嗎?)

  2. 是否有可能使我的資源服務器轉發/ passthru令牌問題請求太我的auth服務器,所以我的其餘api客戶端將不得不處理2臺服務器?

回答

1

是否有可能讓JwtBearer中間件將驗證轉發給我的auth服務器? (可以通過openidConnect來處理它嗎?)

JWT承載中間件始終使用從OpenIddict的配置端點檢索到的簽名密鑰執行本地驗證。您無法強制它將此任務委託給OpenIddict。

是否有可能使我的資源服務器轉發/ passthru令牌問題請求我的auth服務器,所以我的其餘api客戶端將不得不處理2臺服務器?

如果要將令牌驗證部分委託給授權服務器,請不要使用JWT中間件。相反,在OpenIddict選項中啓用自省功能,創建一個新的機密客戶端應用程序註冊並使用aspnet-contrib introspection middleware,這將使用反向通道HTTP調用來驗證傳入令牌。

+0

在向OpenIddict auth服務器添加證書後,jwks工作,資源服務器端可以從中獲取密鑰,並且我知道驗證將發生在資源服務器上,這很好(這是令人擔憂的簽名密鑰的多次註冊)。但是我的REST客戶端應用程序仍然需要直接聯繫auth服務器進行初始令牌發佈。我可以通過我的資源服務器來實現嗎? –

+0

...你也提到,我的情況下,我不應該在我的資源服務器上使用OpenIdConnect。您能否提供一個僅使用JwtBearer設置資源服務器的示例? (刪除openidconnect後,auth.controller中的挑戰失敗,因爲沒有處理程序存在openidconnect方案。如果我將方案更改爲「承載」,它永遠不會聯繫auth服務器,並給予401)。 –

+0

我最終在我的一個小發現方法資源服務器告訴我的REST客戶端在哪裏查找權限,然後在auth服務器上使用.well-known/openid-configuration來查找令牌端點。 –

0

JWT是令牌格式,並且是OpenIdConnect所必需的。您可以使用任何包含JWT的Oauth2令牌格式。所以你不需要跳過智威湯遜。

+0

我覺得我有一個理解一些基本知識的問題,因爲你寫的單詞對我來說沒有任何意義。我花了很多時間試圖弄清楚什麼是流程的一部分,以及在找到如何爲其配置mvc core 2.0和如何實現oid之間完全失去了什麼技術。 –

+0

我寫了一篇關於這方面的文章,並且概述了這些概念。鏈接在這裏 - https://www.linkedin.com/pulse/microservices-security-openid-connect-manish-singh – ManishSingh

+0

好文章。我還發現了一些關於我的mvc設置,並編輯了我的問題,因爲我現在能夠問正確的問題。 –

相關問題