3

1人のユーザーに対してSilverlightアプリケーションの複数の同時使用を制限するタスクが割り当てられました。理想的には、ユーザーが新しいアプリケーションを開くたびに、前のインスタンスが何らかの通知を受け取り、シャットダウンする必要があります。

Silverlightアプリケーションは、RESTエンドポイントを介して公開されたWCFサービスを使用してデータを消費します。現在、サービスへのすべての呼び出しには、パラメーターとしてユーザー名とパスワードがあります。ステートレスなサービスを提供していたので、これは良かったです。すでにこれらのサービスを利用しているアプリがいくつかありますが、私は最も苦痛の少ない解決策を探しています。

ありがとう

4

2 に答える 2

2

さて、質問を誤解したので急いで答えました。私は当初、あなたが同じコンピューター上のインスタンスを参照していると思っていました。

同じコンピューター上で複数のインスタンスを防ぐには、 LocalMessageReceiverクラスを使用できます。

ここに、ユーザーがアプリケーションの2番目のインスタンスを開かないようにする方法を示すコード例を示します。各LocalMessageReceiverには、コンストラクターパラメーターとして一意のチャネル名が必要です。コンストラクターが例外をスローした場合、アプリケーションの別のインスタンスがあると見なすことができます。

最後のアプリケーションインスタンスのみを保持して前のアプリケーションインスタンスを閉じる場合は、インスタンスごとに一意のチャネル名を作成してから、他のインスタンスに閉じるように通知するメッセージをディスパッチする必要があります。

異なるコンピューター上でアプリケーションの複数のインスタンスを防ぐために、私は答える資格がありませんが、最初に頭に浮かぶのは、ユーザーがログインするたびにデータベースに書き込むことです。

サービスが必ずしもステートレスである必要がない場合は、ユーザーがログインするたびに一意の識別子をデータベーステーブルに保持できます(例:ログイン日?)。その後、ユーザーが何らかのアクションを実行したいときはいつでも、データベースの最後の識別子が現在のセッションの識別子に対応しているかどうかを確認できます。そうでない場合は、誰かが別のコンピューターから同じユーザーでログインしていることを意味するため、セッションを期限切れにすることができます。

于 2012-09-28T14:08:02.057 に答える
1

Silverlight 自体はステートレス アプリケーションではないため、単純なサービスとHMACを使用してこれを実装できるはずです。ユーザー名や GUID が既にデータベースにある場合、タイムスタンプ情報と特定のログイン用の特定の HMAC を含む、ユーザーの GUID をキーにした単一のテーブルを追加するのは簡単です。この HMAC は、生成されたタイムスタンプと組み合わせて、マシンに固有のものから生成されます。何かのようなもの:

userGuid | activeHMAC | lastLoginDate | currentlyLoggedIn (bit)

次に、Silverlight コントロールのログイン アクションで、userGuid のレコードを追加または更新して、現在の情報を含めることができます。これにより、すべての新しいログインで既存のログイン HMAC が上書きされます。次に、ログアウトまたはクローズ イベントで、サービスを呼び出してcurrentlyLoggedInビットを false に設定します。

次に、この HMAC が Web サービスへのすべての通信と共に送信されたことを確認して、新しい呼び出しに対して検証できるようにするか、各クライアントが定期的にサービスを呼び出して HMAC を比較し、比較に失敗した場合はクライアントを無効にする必要があります。Silverlight は非接続方式で実行されるため、選択はおそらくデータの整合性によって左右されます。個人的には、HMAC をすべての通信に組み込んで、あらゆる種類のラグ タイムが不適切なアクションを許可しないようにする方が安全だと思います。

于 2012-09-28T14:59:31.617 に答える