3

私が現在開発しているアプリケーションでは、ASP.Netフォーム認証を使用して、ユーザーにサイトへのさらなるアクセスを許可しています。このサイトはモバイルユーザーを対象としているため、サーバーからできるだけ離れて、KnockoutJSを使用してWebサービスを呼び出し、ユーザーが表示できるようにデータをロードするようにしています。

現在、Webサービス(GETメソッドを使用するRESTサービス)では、そのユーザーに固有のデータをロードするためにユーザー名が必要です。この情報はサーバー側(ASP.net)にありUser.Identity.Name、フォーム認証Cookieに直接アクセスするか、直接アクセスして情報を取得することが簡単にできます。

私の問題は、サービス呼び出しを行うことができるように、サーバーからクライアントにユーザー名を取得する必要があることです。私はこれを安全に行うことを検討しましたが、これまでのところ空白になっています。現在、ユーザー名をurlパラメーターとして渡し、JavaScriptを使用して解析しPage_Load、URL内のユーザー名がログインユーザーと一致することを確認するメソッドをチェックしています。

フォームを使用してユーザーを認証したASP.Netからクライアント側のJavaScriptにユーザー名を安全に渡す方法が必要です。これにより、RESTWebサービスを呼び出すことができます。

編集:グーグルでチームリーダーと会った後、次の例のようなOAuth実装を使用すると思います。

http://www.c-sharpcorner.com/UploadFile/surya_bg2000/secure-wcf-restful-service-using-oauth/

また、同じ答えを探している他の人にとって、この質問はOAuthを理解するのに非常に役立ちます。

Nonceを1回しか使用できない場合、OAuthのタイムスタンプのポイントは何ですか?

すべてが正しく実装されていると仮定すると、代わりに、以下に説明するように、生成された署名をASPタグを介して渡す方が安全ですか(完全に安全、安全、または安全ではありませんか?)。

編集2:いくつかのレビューといくつかの検索の後、私たちは最終的にこの作業を行うためのフレームワークと方法を決定しました。OAuthが必ずしもここでの答えではないことが判明したので、この質問は次のとおりです。

しかし、真剣に....OAuthを含むASP.NETWebAPI実装の例

これを機能させる方法を理解する上でも、多くの助けになりました。最終的に行うのは、署名を生成し、JavaScriptを挿入して、そのように呼び出すことです。署名は時間に敏感であり、ユーザーがページをロードするたびに再生成されるため、OAuthと非常によく似ていますが、完全な仕様を実装することはありません。

TL:DR最終的な解決策は、ハッシュ署名を生成し、ASPサーバータグ<%aspvar_here%>を介してページに配置し、それを使用してサービス呼び出しを検証することでした。

4

3 に答える 3

2

最も簡単な方法は、この JavaScript をページに表示することです。

<script type="text/javascript">
   window.UserID = '<%=HttpUtility.JavaScriptStringEncode(this.User.Identity.Name)%>';
</script>

これで、JS で参照できます。

しかし、さらに重要なことは、このユーザー ID がデフォルトのパラメーターとしてだけではなく、ユーザーを認証するために使用されている場合、これはセキュリティ ホールです。User.Identity.Name通常、REST サービスは、引数として受け取る代わりに、見ることもできるはずです。

于 2012-11-13T14:43:11.857 に答える
1

通常、ユーザー名は最初にクライアントから提供されます。その後、サーバー側で (パスワードなど、必要な認証を使用して) 検証されます。

サーバー側で検証されている場合 (この場合、ASMX は REST にうまく対応していないため、これは WCF Web サービスからのものである必要があります)、それが正しいことを確認できます。クライアント側。

編集: Knaģis が指摘したように、ページが HTML ではなく ASPX ページであると仮定すると、ASPX タグを使用して取得できます。

于 2012-11-13T14:43:47.777 に答える
0

クライアント側でユーザー名を取得したいだけの場合は、他の回答でこれを行う方法が説明されています。
しかし、あなたが述べたように、これはセキュリティ上のリスクです。誰かがクライアント上のデータを変更し、別のユーザーになりすますことができます。

これを行う正しい方法:

  1. ユーザーが正常にログインすると、このユーザーを一意に識別するGuidが発行されます。
  2. Guid は、クライアントに保存され、ユーザー名ではなくサーバーに渡されるトークンです。
  3. すべての Web サービスは、ユーザー名ではなく Guid を受け取ります。
  4. サーバーには、Guid を元のユーザー名に変換する辞書があります。

もう 1 つのオプションは、ユーザー名を暗号化し、暗号化された値を Web サービスに渡すことです。ユーザー名を取得するには、Web サービスで値を復号化する必要があります。

于 2012-11-13T14:48:48.923 に答える