0

我試圖更改IdentityServer4 AspNetIdentity示例以便能夠從本地創建的用戶和Google登錄。當通過Google OAuth登錄時使用IProfileService

我能夠加入谷歌認證要做到這一點:

 app.UseIdentity(); 
     app.UseIdentityServer(); 

     var cookieScheme = app.ApplicationServices.GetRequiredService<IOptions<IdentityOptions>>().Value.Cookies.ExternalCookieAuthenticationScheme; 

     // Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715 
     app.UseGoogleAuthentication(new GoogleOptions 
     { 
      AuthenticationScheme = "Google", 
      SignInScheme = cookieScheme, 
      ClientId = "client_id", 
      ClientSecret = "client_secret" 
     }); 

正如預期的那樣在主頁視圖顯示正確的用戶聲明:

sub 
c51da331-0348-45dd-352f-08d4526f6266 
name 
[email protected] 
AspNet.Identity.SecurityStamp 
568a167f-a431-4f70-ba66-918f99e95eef 
idp 
Google 
amr 
external 
auth_time 
1486815555 

在使用谷歌賬戶在首次用戶登錄我向數據庫添加了一些信息,我想我可以通過使用自定義IProfileService實現並將IdentityServer配置爲使用我的自定義IProfileService將它們添加到用戶聲明中:

  var builder = services.AddIdentityServer(); 
     builder.AddTemporarySigningCredential(); 

     builder.AddConfigurationStore(b => b.UseSqlServer(connectionString, options => options.MigrationsAssembly(migrationAssembly))); 
     builder.AddOperationalStore(b => b.UseSqlServer(connectionString, options => options.MigrationsAssembly(migrationAssembly))); 
     builder.AddAspNetIdentity<MyUser>(); 
     builder.AddProfileService<MyCustomProfileService>(); 

但現在,當我導航到主頁時,用戶聲明保持不變,甚至GetProfileDataAsync方法也不會發生。

我很感激有人能告訴我這是什麼感覺。

回答

2

事實證明,除非(如@Set所述)直接調用UserInfo端點,否則IdentityServer將不會使用IProfileService來添加自定義聲明,前提是它將配置爲使用ASP.NET標識庫。設計方法是使用ASP.NET Identity機制通過註冊IUserClaimsPrincipalFactory來創建索賠。

在這種情況下,我們可以創建IUserClaimsPrincipalFactory的自定義實現或因爲ASP.NET身份將加載存儲在數據庫中的任何附加要求,添加使用UserManager類的AddClaimsAsync方法,任何額外的要求。

2

根據github上Adding Custom Claims to an ASPNET Core Identity Implementation的討論,GetProfileDataAsync方法僅在需要將標記放入標記時調用。此外,它有一個鏈接到Optimizing Identity Tokens for size後解釋,這 IdentityServer默認有行爲相應地ID連接規範中,提出以下建議(5.4節):

由配置文件要求的索賠,電子郵件,地址,如第5.3.2節所述,當使用response_type值導致發出訪問令牌時,UserInfo端點將返回電話範圍值。但是,如果沒有訪問令牌發出(response_type值爲id_token的情況),則會在ID令牌中返回結果聲明。

換句話說,如果只請求身份標記,則將所有聲明放入標記中。但是,如果還要求訪問令牌,請從身份令牌中移除聲明,並讓客戶端使用userinfo端點來檢索它們。

但是,可以通過在客戶端配置(更多this)上設置AlwaysIncludeUserClaimsInIdToken標誌來覆蓋此默認行爲。