我一直在設置一個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時,我的令牌驗證發生在資源服務器上,所以我剩下兩個問題。
是否有可能讓JwtBearer中間件將驗證轉發給我的auth服務器? (可以openidConnect處理它嗎?)
是否有可能使我的資源服務器轉發/ passthru令牌問題請求太我的auth服務器,所以我的其餘api客戶端將不得不處理2臺服務器?
在向OpenIddict auth服務器添加證書後,jwks工作,資源服務器端可以從中獲取密鑰,並且我知道驗證將發生在資源服務器上,這很好(這是令人擔憂的簽名密鑰的多次註冊)。但是我的REST客戶端應用程序仍然需要直接聯繫auth服務器進行初始令牌發佈。我可以通過我的資源服務器來實現嗎? –
...你也提到,我的情況下,我不應該在我的資源服務器上使用OpenIdConnect。您能否提供一個僅使用JwtBearer設置資源服務器的示例? (刪除openidconnect後,auth.controller中的挑戰失敗,因爲沒有處理程序存在openidconnect方案。如果我將方案更改爲「承載」,它永遠不會聯繫auth服務器,並給予401)。 –
我最終在我的一個小發現方法資源服務器告訴我的REST客戶端在哪裏查找權限,然後在auth服務器上使用.well-known/openid-configuration來查找令牌端點。 –