IdentityServer4 を使用しています。
他のカスタムクレームをアクセストークンに追加したいのですが、できません。 Quickstart5を変更し、ASP.NET Identity Coreと、Coemgen below で提案されているProfileServiceを介したカスタム要求を追加しました。
ここから私のコードをダウンロードできます:[Zip package] [3]。 (それに基づいています: Quickstart5 ASP.NET Identity CoreおよびProfileService経由の追加クレーム)。
問題:GetProfileDataAsyncが実行されません。
独自のProfileService
を実装する必要があります。同じものを実装したときに私が従ったこの投稿を見てください:
以下は、私自身の実装の例です。
public class ProfileService : IProfileService
{
protected UserManager<ApplicationUser> _userManager;
public ProfileService(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
//>Processing
var user = await _userManager.GetUserAsync(context.Subject);
var claims = new List<Claim>
{
new Claim("FullName", user.FullName),
};
context.IssuedClaims.AddRange(claims);
}
public async Task IsActiveAsync(IsActiveContext context)
{
//>Processing
var user = await _userManager.GetUserAsync(context.Subject);
context.IsActive = (user != null) && user.IsActive;
}
}
Startup.csにこの行を追加することを忘れないでください
services.AddTransient<IProfileService, ProfileService>();
available Identityリソースを正しく設定しましたが(標準とカスタムの両方)、apiを呼び出す際に必要なものリソースを明示的に定義する必要もあります。これを定義するには、ExampleIdentityServer
プロジェクトのConfig.cs
クラスに移動し、new ApiResouirce
コンストラクターのような3番目の引数を指定する必要があります。それらのみがaccess_token
に含まれます
// scopes define the API resources in your system
public static IEnumerable<ApiResource> GetApiResources()
{
return new List<ApiResource>
{
new ApiResource("api1", "My API", new[] { JwtClaimTypes.Subject, JwtClaimTypes.Email, JwtClaimTypes.Phone, etc... })
};
}
本質的に、これは組織にIDクレームを設定したことを意味しますが、複数のAPIが関係している可能性があり、すべてのAPIが利用可能なすべてのプロファイルクレームを使用しているわけではありません。これは、これらがClaimsPrincipal
内に存在することを意味します。残りはすべて、「userinfo」エンドポイントから通常のhttp呼び出しとしてアクセスできます。
AllowOfflineAccess = true
を介して更新トークンを有効にすることを選択した場合、access_tokenの更新時に同じ動作が発生する場合があります "GetProfileDataAsyncは実行されません!"。そのため、access_token内のクレームは同じままですが、更新された存続期間で新しいaccess_tokenを取得します。その場合は、クライアント構成でUpdateAccessTokenClaimsOnRefresh=true
を設定することにより、プロファイルサービスから常に更新するように強制できます。
問題が見つかりました。
Startup.csでは、「services.AddTransient();」を追加する代わりに
Services.AddIdentityServer()に「.AddProfileService()」を追加します
で終わる
services.AddIdentityServer()
.AddTemporarySigningCredential()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddAspNetIdentity<ApplicationUser>()
.AddProfileService<ProfileService>();
Coemgenを手伝ってくれてありがとう!コードに問題はなく、スタートアップだけが間違っていました。
ConfigクラスのGetIdentityResources()でUserClaimsオプションを使用して、任意のクレームを含めることができます。
UserClaims:IDトークンに含める必要がある関連するユーザークレームタイプのリスト。 (公式ドキュメントによる) http://docs.identityserver.io/en/release/reference/identity_resource.html#refidentityresource