0

たとえば、Web API があります: http://example.com/api/product

この Web API を使用する C# クライアントがあります。製品の全リストを取得するようなもの。

// List all products.
HttpResponseMessage response = client.GetAsync("api/products").Result;  // Blocking call!

if (response.IsSuccessStatusCode)
{

    // Parse the response body. Blocking!
    var products = response.Content.ReadAsAsync<IEnumerable<Product>>().Result;

    foreach (var p in products)
    {
        Console.WriteLine("{0}\t{1};\t{2}", p.Name, p.Price, p.Category);
    }
}

else
{
    Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}

C# クライアントからサーバーの API にユーザー名とパスワードを渡すにはどうすればよいですか? 私が欲しいのは、C# クライアントが Web API から製品リスト全体を取得するときです。

クライアントは、ユーザー名とパスワードをサーバーの API に送信します。サーバーの Web API がデータベースから承認されたユーザーであるかどうかを確認する場合、そうでない場合は製品リストを取得しません。

4

2 に答える 2

0

少し前に概念実証で次のアプローチを使用しました。

私はこのようなもの、2つのメソッドを持つ「AuthenticationController」を書きました:

public bool Login(string username, string password, bool rememberMe)
{
    if (Membership.ValidateUser(username, password))
    {
        FormsAuthentication.SetAuthCookie(username, rememberMe);

        return true;
    }

    return false;
}

public void Logout()
{
    FormsAuthentication.SignOut();
}

Login メソッドは、クライアントに送信される Cookie を作成します。次に、各リクエストで、それをサーバーに送り返す必要があります。コントローラー アクションで [Authorize] 属性を使用して、許可されたロールと権限を検証できます。

于 2013-04-10T01:12:07.423 に答える
0

クライアントにトークンを割り当てる認証ルーチンを使用することをお勧めします。その後、クライアントはそのトークンをキャッシュし、後続のリクエストでそのトークンを渡します。認証ルーチンは、ネットワーク上でのスニッフィングを防ぐために SSL 経由で行う必要があり、デバイスにはまったく保存しないでください (トークンはデバイスにキャッシュできます)。

これにより、クライアントをかなり制御できます。サービスは、クライアントを事前に非アクティブ化できる位置にあります (トークンを強制終了し、再認証を強制します - 基本的にタイムアウトの状況です)。また、クライアント上のアプリケーションを保護する立場にもあります (アプリケーションがデバイス上で侵害された場合、ユーザーの資格情報は渡されません)。

DotNetOpenAuthを使用して、このパスに沿って開始することができます。

[System.Web.Mvc.AcceptVerbs(HttpVerbs.Post)]
public ActionResult LogOn(string loginIdentifier)
{
    if (!Identifier.IsValid(loginIdentifier))
    {
        ModelState.AddModelError("loginIdentifier",
                    "The specified login identifier is invalid");
        return View();
    }
    else
    {
        var openid = new OpenIdRelyingParty();
        IAuthenticationRequest request = openid.CreateRequest(
            Identifier.Parse(loginIdentifier));

        // Require some additional data
        request.AddExtension(new ClaimsRequest
        {
            BirthDate = DemandLevel.NoRequest,
            Email = DemandLevel.Require,
            FullName = DemandLevel.Require
        });

        return request.RedirectingResponse.AsActionResult();
    }
}

出典:サンプル コード

于 2013-04-10T01:12:50.237 に答える