2017-10-27 16 views
3

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つに余分なクレームを追加するにはどうすればいいですか?または、偽装を開始したクライアントに合図するためのより良い方法がありますか?

答えて

0

この要件を解決するためにIdentity Server 3で行ったのとは少し異なるルートをとってしまいました。アイデンティティ・サーバーでユーザー名を追加する代わりに、偽装を開始したユーザーのユーザー名をクライアントで一時的なCookieに格納します。 AuthorizationCodeReceived通知では、Cookieの値をチェックし、そこに作成されているプリンシパルにクレームを追加します。

アイデンティティの主張を追加するのと同じくらい安全ではありませんが、すべての主要なセキュリティチェックがまだ行われているため、偽装されたユーザーとして誰がそれを行っているのかを知りたかったので、他の誰かがこれに遭遇し、IDサーバーにクレームを追加する方法を理解している場合は、回答してください。

関連する問題