5

クライアント用のAPIを作成するように依頼されました。始める前に、いくつか質問があります。ASP.NETWebAPIテクノロジを使用することにしました。最初のメソッドを作成しましたが、正常に機能し、製品の結果のセットをXML/Json形式で返すことができます。問題は、私のWebサイトにある私のAPIにアクセスする人は誰でも、私のすべての製品を見ることができるということです。私はすでに顧客のデータベースを持っていますが、APIにアクセスする前に、顧客がいくつかの資格情報を設定する必要があるように、これをどのように使用できますか。

APIは、Webクライアントとデスクトップクライアントの両方からアクセスできる必要があります

私がそれを行うことを考えた1つの方法は、ユーザー名/パスワードをパラメーターとして渡すことですが、これは非常に安全/正しいようには見えませんでしたか?例えば:api/products/GetById/750?username=bob&pass=123

4

4 に答える 4

7

AuthorizeAttribute を使用してコントローラー/アクションを装飾できます。

[Authorize]
public IEnumerable<Product> Get() {...}

これにより、認証されたユーザーのみがリソースを使用できるように制限できます。

実際の認証方法は別の話です。デフォルトでは、Web API は Cookie ベースの ASP.NET フォーム認証を使用します。これは、API が html+js Web クライアントから直接使用される場合に適しています。

一方、API をデスクトップ/モバイル アプリまたはプラグイン ベースの Web クライアントで使用する場合は、Cookie を管理する必要がないため、HTTP 基本認証を使用する方がよい場合があります (このシナリオでは SSL を使用することを忘れないでください)。

http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/にある私のブログ投稿を参照してください。これは、http 基本認証を提供する方法を示しています。 ASP.NET メンバーシップとロール プロバイダーを使用します。

于 2012-05-21T12:33:18.380 に答える
3

間違いなくクエリ文字列を介してではありません。

ASP.NETメンバーシップを使用してみませんか?MSDN

または、製品のリストを返す前に、独自の認証を作成し、ユーザーが適切な権限を持っているかどうかを確認することもできます。

http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/

于 2012-05-21T11:54:45.530 に答える
3
  • API を SSL フォルダー内でホストしたいと考えています。これにより、すべての通信が暗号化されます (クレジット カード番号を Web 経由で送信するのと同じです)。

  • 次のように URL を暗号化することもできます。

    api/products/GetById/750?u=828s388332e328e38&p=328e23e2i38324r423ur29834

    ただし、クライアントが使用する暗号化方法を同期する必要があるため、これは課題です。

  • トークンを使用して、クライアントに有効期限付きのトークンを取得させることもできます。トークンは期限切れになります (1 時間、または 1 日など)。次に、URL は次のようになります。

    api/products/GetById/750?token=1241824123yxxcn2r348

  • 秘密鍵/公開鍵も使用できます: MSDN

于 2012-05-21T12:07:40.413 に答える
0

ユーザー名とパスワードの組み合わせを使用することは問題ありませんが、クエリ文字列を渡すのではなく、この情報をメッセージの要求ヘッダーに追加するという、より標準化された方法(HTTP基本認証)で行います。コードは次のようになります。

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(@"https://localhost:8010/api/Customer/1");
//Add a header to the request that contains our credentials
//DO NOT HARDCODE IN PRODUCTION!! Pull credentials real-time from database or other store.
string svcCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user1"+ ":" + "test"));
req.Headers.Add("Authorization", "Basic " + svcCredentials);

質問には「WCF」と「WebAPI」の両方のタグが付けられているため、クレデンシャルサーバー側の検査は少し異なります。ただし、基本的には「Authorization」ヘッダーをプルし、資格情報を調べて、ユーザーが認証および承認されているかどうかを確認します。認証されていない場合は、HTTP401メッセージを返します。

IISでホストされているWCFRESTベースのサービスの場合、私のブログ投稿から完全な詳細な例を表示できます。

IISでホストされているRESTベースのサービスでの基本認証の使用

于 2013-02-19T16:29:36.763 に答える