5

ASP.NETWebAPIを使用してパスワードの確認サービスを作成しています。

このサービスは、現在サインインしているユーザーのパスワードを受け入れて検証し、エンコードされた値を返します。これはすべてSSLを介して行われます。

このメソッドを呼び出しても、状態は変わりません。

最初はこれはリクエストであるように見えますが、GETさらに詳しく調べると、Webサーバーがプレーンテキストのパスワードをログに記録することが心配です。

これを実装することもできますPOSTが、アクションを考えると間違った動詞のようです。

これは単に手順よりも実用主義のケースですか、それとも実用的なケースとRESTfulなケースの両方を満たすために私たちができることがもっとありますか?

4

2 に答える 2

1

ユーザー名/パスワードをヘッダーとして渡す基本認証を使用する必要があります。これは、標準がすでに定義されているため、より適切です。

base64 エンコーディングを行うためのJavaScriptコードが既に存在します (ブラウザでこれを行う必要がある場合)。


認証のためにこれを行っており、エンコードされた値がアクセス トークン (Cookie) である場合は、OAuth 2.0 を使用することをお勧めします。

于 2013-02-19T12:19:26.577 に答える
0

API 呼び出しが、それ自体がリソースではない (データ ストアから返されたリソースを含まない) 応答を送信する場合は、名詞ではなく動詞を使用する必要があります。

次のようなアクション メソッドを公開する UserPasswordsController コントローラーを使用できます。

[HttpPost()] 
public HttpResponseMessage Validate()
{
    if (!this.Request.Content.IsFormUrlEncodedContent())
    {
        return this.Request.CreateErrorResponse(
            HttpStatusCode.BadRequest, 
            "Body of request must be form URL encoded."
        );
    }

    var parameters  = this.Request.Content.ReadAsFormDataAsync().Result;

    var userName    = parameters["userName"];
    var password    = parameters["password"];

    // TODO: Validate user name and password
    var isValid = true;

    if(!isValid)
    {
        return this.Request.CreateErrorResponse(
            HttpStatusCode.Forbidden, 
            String.Format(null, "The password provided for {0} is not valid.", userName)
        );
    }

    return this.Request.CreateResponse(HttpStatusCode.OK);
}

そして、次のようなルートを登録します。

routes.MapHttpRoute(
    name:           "UserPasswords",
    routeTemplate:  "api/v1/validate",
    defaults:       new { controller = "userpasswords" }
);

検証するユーザー名とパスワードを含む検証エンドポイントにフォーム データを POST します。Forbidden ステータスはパスワードが無効であることを示し、パスワードが有効な場合は OK ステータスが返されます。

REST インターフェイスの作業に慣れておらず、実用的なアプローチを取りたい場合は、 Web API の設計 - 開発者が愛するインターフェイスの作成 をご覧になることを強くお勧めします。

于 2013-02-20T05:03:16.973 に答える