最近のアクセス:
セキュリティ トークン サービスを使用するように GAM を設定する方法

このガイドでは、セキュリティ トークン サービス (STS) を使用するように GAM を設定する方法について説明します。
このシナリオでは、クライアントアプリケーション (AppA) から別のアプリケーション (AppB) のサービスを実行する必要がある場合などに、アプリケーション A からアプリケーション B へのアクセスがリクエストされます。アプリケーション A はセキュリティ トークン サービスにリダイレクトされ、このサービスにより、クライアントの認証とセキュリティトークンの付与が行われます。 
その後、アプリケーション B によって提供されているリソースへのアクセスを得るために、クライアント A からこのアプリケーションにトークンが提示されます。このトークンは STS サーバーに照らして検証され、A に該当するリソースへのアクセス許可が与えられているかどうかが確認されます。問題なければ、A からリクエストされたサービスが実行されます。
このトピックの詳細については、「GAM を使用したセキュリティ トークン サービスによるクライアント認証」を参照してください。

STS サーバーの設定

1.GAM ID プロバイダーで、STS トークンのリクエストを許可する各アプリケーション (AppA など) について、STS を設定します。
イメージ:43207.png
GAM アプリケーションごとに、クライアント ID (クライアントアプリケーション識別子) を設定します。STS プロトコルを有効にし、STS モードをサーバー (トークンサーバー) に設定します。
イメージ:43208.png
各アプリケーションのユーザーを作成します (ローカルユーザーのみでもかまいません)。この例では、user1 というユーザーを作成し、AppA アプリケーションに割り当てています。
トークンのリクエスト時に渡される適用範囲の検証は、このユーザーを使用して行われます。いずれのトークンリクエストについても適用範囲 (複数可) が有効である必要があり、有効でないとトークンは返されません。
2.GAM STS ID プロバイダーで、トークンリクエストの対象となるアプリケーション (この例では AppB) も設定します。
[ Require Access Permissions ] プロパティを True に設定する必要があることに留意してください。そうしないと、STS サーバーでは認証のみが行われ、アプリケーションに対するアクセス権限に関係なくトークンが返されるようになります。
イメージ:43211.png
AppB には、AppA からの呼び出し時に必要なアクセス許可を定義しておく必要があります。
イメージ:43222.png
定義したユーザー (user1) は、これらのアクセス許可を持っている必要があります (ロールを使用するか、ユーザーに直接割り当てます)。
イメージ:43213.png

AppA での GAM の設定

サービスのリクエストを行う側で GAM を設定します。
クライアントのナレッジベースに、該当するアプリケーション (この例では AppA) が存在する必要があります。このアプリケーションは、IP サーバー STS で使用されるものと同じクライアント ID を使用して、AppA として定義します。
イメージ:43214.png
また、STS プロトコルを有効にし、STS をトークン取得モードに設定します。
クライアントパスワードとしては、STS ID プロバイダーで定義したアプリケーションユーザー (この例では user1) のパスワードを使用します。最後に、STS サーバーの URL を設定します。
イメージ:43215.png
AppA から AppB のサービスを呼び出すには、GetSTSAuthorizationAccessToken メソッドを使用して正しい認証ヘッダーを取得し、GetAgentServiceHeader メソッドを使用してサービス呼び出し用の適切なヘッダーを取得する必要があります。

&client_id = !"8e2ec1ea4058491c93c1bfe3bc90a5ad"
&scope = !"AppB.Prm1+AppB.Prm2"
&GAMSTSAuthorizationToken = GAMRepository.GetSTSAuthorizationAccessToken(&client_id, &scope, &GAMErrors)
If &Errors.Count = 0
    &access_token = &GAMSTSAuthorizationToken.access_token
    GAM.GetAgentServiceHeader(GAMServiceTypesHeader.STSOauth, &HeaderName, &HeaderValue)
    &StrCall = "http://localhost/ClientSTS2.NetEnvironment/rest/ProcRest_testSTS"
    &httpClient.AddHeader(&HeaderName, &HeaderValue)
    &httpClient.AddHeader(!"Content-Type",!"application/x-www-form-urlencoded")
    &httpClient.AddHeader(!"Authorization", &access_token)
    &httpClient.AddVariable(!"client_id", &client_id) //&client_id はリクエストの本文で変数として渡される&httpClient.Execute(!"POST", &StrCall)

    msg(format(!"ErroCode %1 (%2)",&httpClient.ErrCode.ToString() + !"" + &httpClient.ErrDescription))
    msg ("Service Result:"+ &httpClient.ToString())

   if &httpClient.ErrCode <> 0
     //プロセスエラー
   Endif

Else
    msg(format(!"%1 (%2)",&Errors.Item(1).Message,&Errors.Item(1).code))
Endif
エラーの有無を確認し、適宜対応します。たとえば、上記のコードを実行し、次のエラーが発生したものとします。
ErrCode 1 (The remote server returned an error: (401) Unauthorized.)
Service Result: {"error":{"code":"280","message":"http:\/\/localhost\/ServerSTS.NetEnvironment\/oauth\/QueryAccessToken access error (expired_token).Please contact the application administrator."}}{}

1 つ目のエラー行は次のコードによってスローされます: msg(format(!"ErroCode %1 (%2)",&httpClient.ErrCode + !"" + &httpClient.ErrDescription))
2 つ目のエラー行は次のコードによってスローされます: msg ("Service Result:"+ &httpClient.ToString())
このエラーは、現在使用しているトークンが有効期限切れであるため、新しいトークンをリクエストする必要があることを示しています。 

AppB での GAM の設定

AppA によって呼び出されたサービスが実行される側のナレッジべースで GAM を設定します。 
呼び出し対象のサービスの [ Integrated Security Level ] プロパティを Authentication (または Authorization) に設定します。
このナレッジベースでは、 [ Application Id ] プロパティを AppB のクライアント ID の値に設定します。したがって、application.gam ファイル (Web GAM アプリケーションを含む) では AppB を参照します。
GAM では、(IP サーバーの STS で) 前に定義したものと同じクライアント ID を使用して AppA を定義し、このアプリケーションで STS トークンを使用してサービスを利用できるようにする必要があります。
STS プロトコルを有効にし、STS をトークン確認モードに設定します。
生成される GAM ローカルセッション用のローカルユーザーを定義します (この例では user1 という名前を付けていますが、任意の名前を指定できます)。
また、AppA によるトークンのリクエスト先となるサーバー (STS サーバー) の URL を設定します。
イメージ:43217.png
注:
この GAM のローカルユーザーは、AppA によって AppB のサービスが呼び出されたときに使用されます。STS トークンが正しければ、このユーザーに関連するローカルセッションが AppA によって生成され、リモートアプリケーションによってサービスが実行されたデータベースに登録されます。これにより、このナレッジベースのローカルトークンを使用してサービスが実行された場合と同じ方法で、GAM メソッドを使用してサービスの現在の利用者 (AppA のユーザー) を特定できるようになります (たとえば、GAMUser.GetId メソッドを使用します)。
概要
必要な作業は、環境を設定し、AppB によって提供されるリソースの呼び出しについていくつかの点を検討することだけです。
AppB で REST サービスを呼び出すと、GetSTSAuthorizationAccessToken メソッドを使用したときに、GAM によって RequestTokenService が自動的に呼び出されます。
続いて、QueryAccessToken が自動的に呼び出され、セキュリティエラーがなければ AppB のサービスが実行されます。問題がある場合は、エラーがスローされ、AppA のユーザーに返されます。
使用可能バージョン
GeneXus 16 Upgrade 4 以降で使用できます。
トラブルシューティング
エラーが発生した場合は、GAM トレースを生成し、ログに記録された情報を参考にすることができます。
GAM の情報はジェネレーターのトレース (.NET の場合、つまり [ Log output ] プロパティを ASP.NET trace に設定した場合は ASP.NET トレース) でスローされるため、HTTP リクエストのヘッダーや本文で送信される変数を確認するのに非常に役立ちます。
コンポーネント (STS サーバー、AppA サーバー、AppB サーバー) の一部のトレースが必要なのか、すべてのトレースが必要なのかは、表示されたエラーによって異なります。
たとえば、RequestTokenService は STS サーバーに対して実行されるため、呼び出しの詳細はサーバーのトレースで確認できます。
イメージ:43241.png
トレースの次のセクションを確認してください:
イメージ:43242.png
AppA 側 (呼び出し側) では、トレースの次のセクションを確認してください (この情報は GAM によって記録されます):
2019-05-21 13:06:55,954 35 DEBUG GeneXus.Http.Client.GxHttpClient - Start HTTPClient buildRequest: requestUrl: method:POST name:http://localhost/ServerSTS.NetEnvironment/oauth/RequestTokenService 0.017558
GeneXus.Http.Client.GxHttpClient 2019-05-21 13:06:55,954 35 DEBUG GeneXus.Http.Client.GxHttpClient - Start SendStream.Read: BytesRead 0
GeneXus.Http.Client.GxHttpClient 2019-05-21 13:06:57,102 35 DEBUG GeneXus.Http.Client.GxHttpClient - Reading response...
GeneXus.Http.Client.GxHttpClient 2019-05-21 13:06:57,102 35 DEBUG GeneXus.Http.Client.GxHttpClient - BytesRead 192
GeneXus.Http.Client.GxHttpClient 2019-05-21 13:06:57,102 35 DEBUG GeneXus.Http.Client.GxHttpClient - BytesRead 0
GeneXus.Http.Client.GxHttpClient 2019-05-21 13:06:57,102 35 DEBUG GeneXus.Http.Client.GxHttpClient - _responseString {"access_token":"2819262c-cdfd-4389-a1b3-b6548ec96add!2cb084f437f88ea7ec0d2c6b7c420fd2ff877447e7b7392f876cbaed9bdf54b6a1e0383b63cddb","token_type":"Bearer","expires_in":60,"scope":"AppB.Prm1"}
Artech.Security.API.repositorygetstsauthorizationaccesstoken 2019-05-21 13:06:57,102 35 INFO  Artech.Security.API.repositorygetstsauthorizationaccesstoken - GAMTrace-RepositoryGetClientAuthorizationAccessToken URL:http://localhost/ServerSTS.NetEnvironment/oauth/RequestTokenService
Artech.Security.API.repositorygetstsauthorizationaccesstoken 2019-05-21 13:06:57,102 35 INFO  Artech.Security.API.repositorygetstsauthorizationaccesstoken - GAMTrace-RepositoryGetClientAuthorizationAccessToken Response:{"access_token":"2819262c-cdfd-4389-a1b3-b6548ec96add!2cb084f437f88ea7ec0d2c6b7c420fd2ff877447e7b7392f876cbaed9bdf54b6a1e0383b63cddb","token_type":"Bearer","expires_in":60,"scope":"AppB.Prm1"}
Artech.Security.API.repositorygetstsauthorizationaccesstoken 2019-05-21 13:06:57,102 35 INFO  Artech.Security.API.repositorygetstsauthorizationaccesstoken - &Errors....................: [ ]

ネットワークトラフィックの分析に対応したツールも HTTP リクエストとその応答を確認するのに役立ちます。 





サブページ
Created: 20/01/10 00:33 by Admin Last update: 21/05/20 18:13 by Admin
カテゴリ
Powered by GXwiki 3.0