0

ローカル作成ユーザーとGoogleの両方からログインできるようにIdentityServer4 AspNetIdentityサンプルを変更しようとしています。ホームビューは、正しいユーザー主張を示して期待通り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" 
     }); 

は、私はGoogleの認証を追加することにより、これを行うことができた

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

ときのGoogleアカウントを使用して、初めてのユーザーがサインインいくつかの情報をデータベースに追加し、カスタムIProfileService実装を使用し、カスタムIProfileServiceを使用するようにIdentityServerを設定することで、ユーザークレームに追加できると考えました。

  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はASP.NET IDライブラリを使用するように構成されている場合、IProfileServiceを使用してカスタム要求を追加しません。設計アプローチは、IUserClaimsPrincipalFactoryを登録することによって、クレームを作成するためのASP.NET IDメカニズムを使用することです。

このケースでは、IUserClaimsPrincipalFactoryのカスタム実装を作成するか、ASP.NET IDがデータベースに格納されている追加の要求を読み込み、AddClaimsAsyncメソッドを使用して余分な要求を追加するため、UserManagerクラスを追加します。

2

githubのAdding Custom Claims to an ASPNET Core Identity Implementationでの議論によれば、GetProfileDataAsyncメソッドは、クレームをトークンに入れる必要がある場合にのみ呼び出されます。

プロファイルによって要求されたクレーム、電子メール、アドレス:また、それは(セクション5.4で)次のことを示唆して、デフォルトで IdentityServerがそれに応じOpenIDの接続仕様に行動を持っていることを、説明してOptimizing Identity Tokens for sizeポストへのリンクを、持っています、および電話スコープの値は、アクセストークンが発行されるresponse_type値が使用されたときに、5.3.2項で説明したように、UserInfoエンドポイントから戻されます。ただし、アクセストークンが発行されない場合(response_type値id_tokenの場合)、結果のクレームはIDトークンに返されます。

つまり、アイデンティティトークンのみが要求されている場合は、すべてのクレームをトークンに入れます。ただし、アクセストークンが要求されている場合は、>クレデンシャルをアイデンティティトークンから削除し、クライアントがuserinfoエンドポイントを使用して取得するようにします。

ただし、クライアント構成(this以上)にAlwaysIncludeUserClaimsInIdTokenフラグを設定することで、この既定の動作を無効にすることができます。

関連する問題