PreAuthenticateを使用して、管理者用のクライアントアプリケーションにユーザーを一時的に偽装するIdentityServer3からポートコードを移植しようとしています。Idenity Server 4 IAuthorizeInteractionResponseGeneratorで追加の要求を注入する
hereのスレッドに続いて、私はカスタムIAuthorizeInteractionResponseGeneratorのProcessInteractionAsyncをオーバーライドしています。これはうまく動作しますが、すべて機能していますが、これが偽装されたid_tokenであることがわかるように、クライアントアプリケーションに返される余分なクレームを追加することはできません。オーバーライドでSubjectをValidatedAuthorizeRequestに置き換える際に、偽装を開始したユーザーを指定する追加の要求を追加しますが、この要求はid_tokenまたはアクセストークンには反映されません。
public override async Task<InteractionResponse> ProcessInteractionAsync(ValidatedAuthorizeRequest request, ConsentResponse consent = null)
{
string impersonatedUserName = request.GetPrefixedAcrValue("Impersonate:");
if (!string.IsNullOrWhiteSpace(impersonatedUserName))
{
if (request.Client.AllowedScopes.Contains(Constants.ClaimTypes.Impersonation))
{
var currentUser;
var impersonatedUser;
//Omited code to verify eligibility to impersonate user
if (impersonatedUser != null)
{
IEnumerable<string> requestedClaimTypes = request.Client.AllowedScopes;
IdentityServerUser idSrvUser = new IdentityServerUser(impersonatedUser.Id.ToString())
{
AuthenticationTime = Clock.UtcNow.UtcDateTime,
DisplayName = impersonatedUser.UserName,
IdentityProvider = !string.IsNullOrEmpty(impersonatedUser.PasswordHash) ? IdentityServerConstants.LocalIdentityProvider : "external"
};
ProfileDataRequestContext context = new ProfileDataRequestContext(
idSrvUser.CreatePrincipal(),
request.Client,
nameof(AuthorizeInteractionResponseGenerator),
requestedClaimTypes);
await Profile.GetProfileDataAsync(context);
//Need this claim to flow through to client
context.IssuedClaims.Add(new Claim(Constants.ClaimTypes.Impersonation, currentUser.UserName));
foreach (Claim claim in context.IssuedClaims)
{
idSrvUser.AdditionalClaims.Add(claim);
}
ClaimsPrincipal newSubject = idSrvUser.CreatePrincipal();
request.Subject = newSubject;
Logger.LogInformation("Impersonation set, returning response");
return new InteractionResponse();
}
else
{
Logger.LogWarning("Invalid attempt to impersonate user");
return new InteractionResponse { Error = "Invalid attempt to impersonate user" };
}
}
else
{
Logger.LogWarning("Client does not support impersonation!");
return new InteractionResponse { Error = "Client does not support impersonation" };
}
}
return await base.ProcessInteractionAsync(request, consent);
}
クライアントが要求するが、それでもまだ含まれていないこの特別な主張の範囲を追加しました。私はここに欠けている何かが明らかであるように感じます。トークンの1つに余分なクレームを追加するにはどうすればいいですか?または、偽装を開始したクライアントに合図するためのより良い方法がありますか?