5

次のように構築された N 層アプリがあり
ます。IIS7 のサーバー側には、WCF サービスでメソッドを公開する ASP.Net アプリケーションがあります。これらのメソッドは、EF4 を使用して DB と通信します。Silverlight 4.0 で記述されたクライアントは、WCF サービスでメソッドを呼び出しています。

WCF サービスは、次のメソッドを公開します。

[OperationContract]
void DeleteItem(int i_ItemId);

私は WCF サービスを初めて使用しますが、次の観察結果は正しいと思います (間違っている場合は訂正してください)。

1)このメソッド/サービスをそのままにしておくと、私のサービスがhttp://www.mysite.com/myservice.svcにあることを知っている人なら誰でも、 VisualStudioを開いて「サービス参照の追加」を開いて呼び出しを開始できますDeleteItem() に。

2) MEX エンドポイントを削除して上記の問題を解決しようとすると、手動コーディングを使用してサービスを呼び出すことができます。

そこで、これら 2 つの問題を解決しようとして、WCF に組み込まれているいくつかのセキュリティ機能について学び始めました。簡単に調べた後、サービスを呼び出すためにユーザー名とパスワードが必要になるように、次のバインディング構成を使用できると考えました。

  <wsHttpBinding>
    <binding name="RequestUserName" >
      <security mode="Message">
        <message clientCredentialType="UserName"/>
      </security>
    </binding>

このソリューションを採用しようとして、最初に頭に浮かんだことは次のとおりです。ユーザーがクライアントにログインすると、クライアントはユーザーの名前とパスワードを WCF 呼び出しの資格情報として使用します。サーバー側では、これらの資格情報が DB に対して検証されます。

ここでの問題は、これらの資格情報 (userName と password) はもちろんユーザーに知られているため、既に述べた方法でそれらを使用して DeleteItem() を呼び出すことができることです。

ここから、2 つの解決策を思いつきました。

1) ユーザー名とパスワードを資格情報として使用する代わりに、クライアントでハードコードされたキーを使用します。XAP 内の Dll をスクランブルすると、誰かがこのキーを取得できなくなる可能性があります。

2)ユーザーがクライアントにログインすると、サーバーはある種の一時トークン(GUIDなど)を送信します。これにより、クライアントはこの通信セッション中に呼び出しを認証するために使用できます(ユーザーがクライアントを閉じるまで) .

私の質問は:

最初のソリューションが提供するセキュリティ レベルと、それをクラックするために必要な作業はどれくらいですか?

最初の解決策がクラックするのが非常に簡単である場合、2番目の解決策で言及したトークンシステムを管理するための組み込みの方法が WCF にありませんか?

スコープに足を踏み入れることができる他のソリューションは歓迎されます。

4

1 に答える 1

1

あなたが質問しているセキュリティレベルについてはわかりませんが、難読化されているかどうかにかかわらず、ユーザー名とパスワードを XAP ファイルに保存する自信はありません。

本番環境で実装したソリューションについて説明できます。

基本的に、標準のフォーム認証でアプリケーションを保護しますが、ASP.NET で通常行うようなリダイレクトは使用せず、ASP.NET フォーム認証に同梱されている認証 Web サービスを使用します。そうすれば、私のログインは Silverlight コントロールを通過します。私のアプリには、Authentication Service を認証するためのユーザー ストアがあります。

認証サービスにフックするには、Global.asax で次のようにします。

protected void Application_Start(object sender, EventArgs e)
{
    AuthenticationService.Authenticating += new EventHandler<AuthenticatingEventArgs>(AuthenticationService_Authenticating);
}

void AuthenticationService_Authenticating(object sender, AuthenticatingEventArgs e)
{
    try
    {
        bool authenticated = //Call your user store here.

        e.Authenticated = authenticated;
    }
    catch (Exception ex)
    {
        e.Authenticated = false;
    }
    e.AuthenticationIsComplete = true;
}

<authorization>エレメントを<deny users="?">. ブラウザがすべての Cookie を処理します。サービスを保護したい場合は、Service/ フォルダーの下で、認証されていないユーザーを拒否します。

このMSDN の投稿では、ソリューションについて詳しく説明しています。

于 2011-08-05T19:05:14.957 に答える