web-dev-qa-db-ja.com

IdentityServer4のアクセストークンにカスタムクレームを追加する方法は?

IdentityServer4 を使用しています。

他のカスタムクレームをアクセストークンに追加したいのですが、できません。 Quickstart5を変更し、ASP.NET Identity Coreと、Coemgen below で提案されているProfileServiceを介したカスタム要求を追加しました。

ここから私のコードをダウンロードできます:[Zip package] [3]。 (それに基づいています: Quickstart5 ASP.NET Identity CoreおよびProfileService経由の追加クレーム)。

問題:GetProfileDataAsyncが実行されません。

35
001

独自のProfileServiceを実装する必要があります。同じものを実装したときに私が従ったこの投稿を見てください:

https://damienbod.com/2016/11/18/extending-identity-in-identityserver4-to-manage-users-in-asp-net-core/

以下は、私自身の実装の例です。

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>();
46
Blennouill

ここで問題はこれです:

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を設定することにより、プロファイルサービスから常に更新するように強制できます。

26
cleftheris

問題が見つかりました。

Startup.csでは、「services.AddTransient();」を追加する代わりに

Services.AddIdentityServer()に「.AddProfileService()」を追加します

で終わる

        services.AddIdentityServer()
            .AddTemporarySigningCredential()
            .AddInMemoryIdentityResources(Config.GetIdentityResources())
            .AddInMemoryApiResources(Config.GetApiResources())
            .AddInMemoryClients(Config.GetClients())
            .AddAspNetIdentity<ApplicationUser>()
            .AddProfileService<ProfileService>();

Coemgenを手伝ってくれてありがとう!コードに問題はなく、スタートアップだけが間違っていました。

17
001

ConfigクラスのGetIdentityResources()でUserClaimsオプションを使用して、任意のクレームを含めることができます。

UserClaims:IDトークンに含める必要がある関連するユーザークレームタイプのリスト。 (公式ドキュメントによる) http://docs.identityserver.io/en/release/reference/identity_resource.html#refidentityresource

2
JayDeeEss