SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlight 4で作る新しいRIAアプリケーション

Silverlight 4における信頼されたアプリケーション

Silverlight 4で作る新しいRIAアプリケーション(9)

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード Source.zip (860.1 KB)

ドメイン間アクセスの制限の緩和

 Silverlightで通信を行う場合に、必ず問題となるのがクロスドメインの問題です。

 Silverlightアプリケーションで、そのアプリケーションがホストされているドメイン以外と通信を行う場合、通信先のドメインに配置された、ドメイン間ポリシーファイルのポリシーにしたがって通信が制約されます。

 これは、WebサイトなどにホストされたSilverlightアプリケーションが、DDoS攻撃などに利用されないために用意されているセキュリティーのための機能です。

 詳しくは、次の記事を参照してください。Silverlightとサーバーサービスの連携

 Silverlightでは、信頼されたアプリケーションで構成されている場合に限り、ドメイン間アクセスの制限から解放されます。例えば、System.Net.WebClientクラスを使ったHTTP通信であれば、ドメイン間ポリシーファイルの存在の有無に関係なく通信できます。

 リスト2 は、ドメイン間ポリシーファイルを配置していない、筆者のブログのRSSを取得するコードです。通常のブラウザー外実行の場合、セキュリティ例外が表示され、信頼されたアプリケーションであれば取得したRSSのXMLが表示されるのを確認できます。

リスト2 HttpWebRequestを使用してファイルを取得する例
var client = new WebClient();
client.DownloadStringCompleted += (_s, _e) => {
    if (_e.Error != null)
    {
        MessageBox.Show(_e.Error.ToString());
        return;
    }
    MessageBox.Show(_e.Result);
};
client.DownloadStringAsync(new Uri("http://karuakun.wordpress.com/feed/"), null);

 System.Net.Socketクラスを利用したクロスドメインのサンプルも見ておきましょう。通常、System.Net.Socketクラスを使った通信を行う場合、MSDNのネットワークセキュリティのアクセス制限にあるように、ポリシーファイルを配信するようなサービスを別途作るなど、多少面倒な手順が必要になります。

 リスト9 は、画面のFTP接続ボタンがクリックされたタイミングで、ローカルコンピューターで稼働中のFTPサーバーに接続して、切断する簡単なサンプルです。ここでは、サンプルの詳細な解説は行いません。

リスト9 ソケットを使ったサンプル
private void ConnectFtpServer(object sender, RoutedEventArgs e)
{
    var host = new DnsEndPoint("localhost", 21);
    var ftpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    var args = new SocketAsyncEventArgs()
    {
        RemoteEndPoint = host,
        UserToken = ftpSocket,
    };
    args.Completed += args_Completed;
    ftpSocket.ConnectAsync(args);
}

void args_Completed(object sender, SocketAsyncEventArgs e)
{
    // 通常のアクセスの場合はAccessDeniedになる。
    if (e.SocketError != SocketError.Success)
        Deployment.Current.Dispatcher.BeginInvoke(
				() => { MessageBox.Show("失敗"); });
    else
        Deployment.Current.Dispatcher.BeginInvoke(
				() => { MessageBox.Show("成功"); });
    e.ConnectSocket.Close();
}

 Socketクラスを利用したドメイン間通信では、通信が開始されると、まず最初に接続先コンピューターの943番ポートでホストされているドメイン間ポリシーファイルを取得しようとします。今回の例では、localhost:943にドメイン間ポリシーファイル用のサービスは提供されていません。このため、通常のSilverlightからの利用の場合は、e.SocketErrorがAccessDeniedになり、接続に失敗しますが、信頼されたアプリケーションで実行する場合は、ドメイン間ポリシーファイルを利用しないため、問題なくFTPサーバーに接続できます。

Silverlight4におけるSocketクラスのドメイン間ポリシーファイル

MSDNのネットワーク セキュリティのアクセス制限 (Silverlight)にある通り、Silverlight4でSocketクラスを使った通信を行う場合、943番のポートでポリシーファイル用のサービスを作成する以外にも、80番ポートを利用したポリシーファイルの配布を検討することができます。

次のページ
ユーザーの同意やユーザーが開始した操作に関する要件の緩和

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Silverlight 4で作る新しいRIAアプリケーション連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト かるあ (杉山 洋一)(カルア(スギヤマ ヨウイチ))

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5785 2011/04/12 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング