クロスサイトリクエストフォージェリ(CSTRF)対策のため、StoreFrontではCsrf Tokenを利用する機能が
実装されています。
SDKを確認すると、HTTP、HTTPSの両通信で必須となっており、GUIから無効にすることはできないのですが、
極稀にですが、Csrf-Tokenの利用を無効化したい場合があります。
NetScaler等の機器でこのCookieを削除するルール(Rewrite)を作成してStoreFrontのLB用VIPに適用すると
エラーが発生して利用できません。やはりCsrf-TokenのCookieは必須のようです。
Wiresharkでキャプチャしたパケットを眺めていると、ブラウザを経由せずにReceiverへサイトを登録して
接続するとCsrf-Tokenを利用していないことが判明しました。Csrf-Tokenは、Firefox等のブラウザで利用
した時だけ利用するような仕組みが実装されているようです。
StoreWeb\Web.conf の中身を調査していくと、気になる行が見つかりました。
excludedUserAgents とあるのでこの後に記述されているUserAgentsはcsrfProtectionが無効になるような
雰囲気を醸し出しています。
Receiverから接続した際のUserAgentsはCitrixReceiverが設定されておりReceiverからの利用では
Csrf-Tokenが利用されていないのも納得できそうな雰囲気がします。
ちなみにMozillaを追加すると、ブラウザ経由で利用した時もCsrf-Tokenを利用しなくなりました。
Csrf-Tokenの利用の有無は、内部的にIsCsrfProtectionEnabled()関数で処理されており、
System.Text.RegularExpressions内のIsMatchメソッドで判断していました。
ILSpyを使うと内部構造がわかるので重宝しています。
Web.confを直接書き換えてしまうとメーカサポートが受けられなかったり、何かしらのタイミングで元に
戻る心配があります。
その場合には、直接ヘッダに含まれているUser-Agentを書き換えてしまえば解決します。
NetScalerをStoreFrontのLBとして利用している場合にはRewrite機能を利用します。
GUIでは説明が大変なのでコンソールより次のコマンドを実行します。
add rewrite action replace_useragent_action replace "HTTP.REQ.HEADER(\"User-Agent\")" "\"CitrixReceiver\""
add rewrite policy replace_useragent_policy HTTP.REQ.IS_VALID replace_useragent_action
作成したポリシーをVIPに割り当てます。
bind lb vserver LB用VIP名 -policyName replace_useragent_policy -priority 100 -gotoPriorityExpression END -type REQUEST
これでVIPに対するリクエストに含まれるUser-AgentをCitrixReceiverに書き換えます。