MS_XBAP - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

XBAP

概要

XBAP は www ブラウザ上で動作する WPFアプリケーションで、
ClickOnceによる配布・自動更新機能が付属する。
(しかし、昨今、モダンブラウザに対応していない。)

  • 「XBAP」は、.NET Framework により提供される ClickOnce技術を併用、
    HTTP / HTTPS プロトコルによるデプロイと自動更新が可能である。

  • ClickOnce と基本的には同じであるが、
    www ブラウザ上で動作するため、より強い「セキュリティ制限」を受ける
    (サンドボックス化される)。

    • 具体的には、Administrators と Power Users グループのトークンが除外された
      プロセスで実行されるため、『完全信頼』であっても
      クライアント側コンピュータ上でのリソース アクセスには制限がある。
    • また、IE にホストされるため、カレント ディレクトリは
      %windir%\System32 となる。
      このため、コンフィギュレーション、業務データの保存先として
      環境変数 USERPROFILE 以下のフォルダを使用するためには、
      環境変数を使用した絶対パスで指すことができるようなプログラム部品が必要になる。

移行メモ(正式名称): XBAP = XAML Browser Application
(XAML ブラウザー アプリケーション)。拡張子は .xbap

補足(現在の位置づけ:完全に終了している): 本ページが
「モダンブラウザに対応していない」と書いているとおり、
XBAP は現在まったく使えない

時期 出来事
2015 Chrome が NPAPI を廃止。Edge (旧) が ActiveX 非対応
2019 .NET Framework 4.8 で XBAP は既定で無効(部分信頼の廃止に伴う)
2022-06 IE 11 サポート終了 → 動作環境が消滅
現在 .NET Core 以降には移植されていない

「ブラウザ内でリッチ クライアントを動かす」という発想自体が、
Silverlight / Flash / Java アプレットと共に終わった。
後継にあたるのは WebAssemblyBlazor)である。
本ページは歴史資料として読むのが妥当である。

セキュリティ

  • 「XBAP」アプリケーションは、通常「インターネット ゾーン アクセス許可セット」に
    制限された「サンド ボックス」と呼ばれる「部分信頼」の
    セキュリティ境界内で動作するため、
    通常の .NET アプリケーションと比べ制限がある。

  • 制限無しで動作させるには、「完全信頼」を使用する。

    • 「完全信頼」は、プロジェクトのプロパティから設定可能である。
    • 「完全信頼」の「XBAP」を配置する場合、
      セキュリティ ゾーンによって、それぞれ異なる施策が必要になる。
項番 セキュリティ ゾーン 動作 完全信頼を受け取るための操作
1 ローカル コンピュータ 完全信頼として動作する
2 イントラネットおよび信頼されたサイト 完全信頼のプロンプトを表示 プロンプトに出所が表示されるように、証明書を使用してコード サイニングを行う。
3 インターネット サイト TTP(CA)から発行された証明書があれば、完全信頼として動作する。 TTP(CA)の証明書を使用してコード サイニングを行う。
  • 故に、「完全信頼」で動作させるには、基本的に、
    証明書によるコード サイニングが必要になる。

注意事項

セキュリティ

「部分信頼」では実現できない機能が多い。

ランタイム

WPFをサポートする実行環境に加え「XBAP」をホスト可能な
www ブラウザが必要。

デプロイ

  • .NET Framework のランタイムなどについては、必須コンポーネントに含める
  • クライアントへのインストールが不要なものであれば、
    参照設定のローカルコピーを true に設定。

複数画面表示

  • 別ウィンドウやモーダル ダイアログとして Window の起動ができない
    (ただし Win32 ダイアログについては起動可能)。
  • モーダル ダイアログに相当する代替表現として、「ユーザ コントロール」を、
    ルートのパネル要素に追加(Children.Add)する方法がある。

リソース アクセス

完全信頼であってもクライアント PC 上でのリソース アクセスには制限があるので
注意する(Administrators と Power Users グループのトークンが除外された
プロセスで実行される)。

F5ボタンの抑止

[F5]ボタンを押下すると、当該画面の再初期化
(コンストラクタや、Page_Loaded イベントの実行)が発生する。
これは、以下のようなコードで抑止できるが、
www ブラウザのアドレスバーにフォーカスをあてた状態で F5 を押下した場合など、
完全な抑止ができない。

<Page x:Class="WpfBrowserApplication1.Page1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="Page1" KeyDown="Page_KeyDown">
private void Page_KeyDown(object sender, KeyEventArgs e) {
  if (e.Key == Key.F5) e.Handled = true;
}

NavigationWindow / Page

  • NavigationWindow / Page は、画面遷移の履歴を保持し、
    www ブラウザの[進む]・[戻る]ボタンから、
    [進む]・[戻る]操作が可能となっている。

    • こちらも(上記、「F5 ボタンの抑止」と同様に)、
      [進む]・[戻る]時に、当該画面の再初期化が発生する。
    • また、このため、バック サブミットのような操作が行われ得るので、
      必要に応じてこの[進む]・[戻る]操作を抑止する必要がある。
  • IE6 / Firefox では、Page.ShowsNavigationUI プロパティを false
    設定することで[進む]・[戻る]ボタンを非表示にできるが、
    IE7 以降では、false に設定しても非表示にはならない。

    • このため、画面遷移時の Frame.Navigated イベントなどで、
      画面遷移の履歴を削除するか、
    • 運用(責任の所在をユーザのオペレーションに委任すること)で
      回避するようにする。

補足(同じ問題は Web でも起きる): 「F5 と[戻る]で再初期化・
二重サブミットが起きる」という問題は、XBAP 固有ではなく
ブラウザ上で動作する全てのアプリに共通する。
ASP.NETでも同様で、
現在は PRG パターン(Post/Redirect/Get)
トークンによる二重送信防止で対処するのが標準である。
「運用で回避」より、設計で潰す方が確実である。

アセンブリ キャッシュ

  • アセンブリの取得・更新のたび、各バージョンのアセンブリがダウンロードされるため、
    各バージョンのアセンブリがダウンロード キャッシュ
    C:\WINDOWS\assembly\Download)に溜まる。
  • ディスク容量に問題がある場合は、クライアント側で
    gacutil /cdl コマンドを実行して、ダウンロード キャッシュをクリアする。

参考


Tags: 移行, .NET開発, UIサブシステム, WPF/Silverlight, XAML, セキュリティ

⚠️ **GitHub.com Fallback** ⚠️