私はasp.netWebアプリケーションを持っており、そこではいくつかのajaxリクエストを処理するためにいくつかのサービスを使用しています。問題は、対応する呼び出しが私が提供したページに来るかどうかをどのように判断するかです。ページでフォーム認証を使用しています。同じフォーム認証を介してweserviceを呼び出すユーザーを承認する方法はありますか?
2 に答える
これは、私がすでに答えた古い質問を思い出させます。シナリオは異なりますが、根本的な問題は同じです。WebフォームからWebサービスを呼び出す場合、認証データをフォームと共有するにはどうすればよいですか。
これに対する単純で厳密な解決策はありません。WS-SecurityをWebサービスに実装することを検討し、ユーザーが許可されていることを確認した後、WebフォームにWebサービスに対して自身を認証させることができます。
Webサービスは、パラメーターメソッド(つまり)として明示的に渡されない限り、ユーザーログインに関する情報を共有しませんがvoid PerformAction(string userId, ...)
、この場合、パースペクティブが劇的に変化することに注意してください。
これは私の頭に浮かぶ最良のアイデアですが、Webサービスを大幅に再設計するか、ユーザー生成クライアント(つまり、WSDLに対してコンパイルされたデスクトップアプリケーション)にサービスを使用させることができないことに注意してください。
[追加]シナリオをもう少し詳しく説明したので、ここにソフトウェアエンジニアリングのエキサイティングな部分があります:)
コメントで述べたように、たとえば次のような複数のオプションがあります。
- ユーザー名/パスワードをページのマークアップ(Javascript変数)に保存し、JQueryにWebサービスのパラメーターとして送信させます。その後、WSはそのデータに基づいてリクエストを認証します。誰かがユーザーキャッシュにアクセスできる場合、パスワードが悪用されるため(共有/パブリックコンピューターで誰かのパスワードを盗むためのより簡単な方法があるため、それらについては説明しません)、また、プレーンHTTPからHTTPSに切り替える予定がある場合は、推奨されません。安全な認証なら、Webサービスも保護する必要があります
- Webアプリケーションに、Webサービスに有効な認証トークンを生成させます。アイデアは次のように聞こえます。まず、WebアプリケーションとWebサービスの間で共有オブジェクト(
Application
コレクション内のオブジェクトなど)を使用するか、WebアプリケーションとWebサービスが異なるサーバー上にある場合はDBMSを使用します。次に、Webアプリケーションが認証に成功するたびに、一意のトークンを生成し(セッションIDで問題ない場合があります)、Webサービスに渡されるJS変数に格納します。最後に、Webサービスが呼び出されたときに、トークンが有効であることをその共有オブジェクトに対して確認します(つまり、ユーザーが認証され、ログインしたままで、そのWebサービスにアクセスする権限があるため、認証と承認の両方)。それ以外の場合は拒否します。
フォーラム認証を行っているので、WebMethodでこのようなことを行うことができます
If Not HttpContext.Current.User.Identity.IsAuthenticated Then
Return Nothing
End If
ただし、GETを実行している場合は、例外をスローする方がよい場合があります。そうすれば、空の結果がクライアント側にキャッシュされません。