3

以下のテクノロジーを使用して Web サイトを開発しています。

MVC 4 EF 5 Web Api 将来 - Windows Phone/Windows 8 アプリケーションの可能性。

私は Web API を使用しているため、他のクライアントで使用できる API を開発しています。

ただし、API に対してリクエストが行われるたびに、ユーザーを承認する必要があります。私の最初の考えは、HTTP ヘッダーを介してこれを行うことでした。ただし、MVC アプリケーションに Web API の代わりに MVC コントローラーを使用し、RESTful api を作成する必要があるかどうかは疑問です。電話/win 8 アプリケーションを開発する場合は、ユーザーを認証する必要があります。したがって、元の問題はまだ存在します。

人々の考えは何ですか?認証されたユーザーの詳細をHTTPヘッダー経由で安全に渡す方法に関するチュートリアルを教えてください.

4

1 に答える 1

1

基本認証を使用して、承認用の資格情報を渡します。これにより、クレデンシャルがヘッダーに配置されます。これを行うには、JQueryajax関数のbeforeSendイベントハンドラーを使用するのが非常簡単です。これを行う方法の例を次に示します。

    getAuthorizationHeader = function (username, password) {
      var authType;
      var up = $.base64.encode(username + ":" + password);
      authType = "Basic " + up;
    };
    return authType;
 };

    $.ajax({
        url: _url,
        data: _data,
        type: _type,
        beforeSend: function (xhr) {
            xhr.setRequestHeader("Authorization", getAuthorizationHeader(username, password));
        },
        success: ajaxSuccessHandler,
        error: ajaxErrHandler
    });

これは、ヘッダーで送信されるユーザー名/パスワードをエンコードします。デコードが簡単なため、これはエンコーディングだけに依存するのに十分なセキュリティではないことに注意してください。それでも、HTTPS / SSLを使用して、有線で送信される情報が安全であることを確認する必要があります。

Web API側では、ヘッダーから資格情報を取得し、それらをデコードして、承認プロセスを実行するカスタムAuthorizeAttributeを作成できます。コントローラではなく、WebAPIによって使用される個別のAuthorizeAttributeがあります。カスタムAuthorizeAttributeを作成するときは、必ずSystem.Web.Http.AuthorizeAttributeを基本クラスとして使用してください。それらは異なる振る舞いをします。コントローラ用のものはログオンページにリダイレクトしたいのに対し、WebAPI用のものは成功または失敗を示すHTTPコードを返します。承認が認証ではなく承認による失敗を区別できない場合、クライアントがそれに応じて対応できるように、HTTPコードForbiddenを返します。

これは、カスタムAuthorizeAttributeで使用できるヘッダーから資格情報を取得するためのメソッドの例です。

    private bool GetUserNameAndPassword(HttpActionContext actionContext, out string username, out string password)
    {
        bool gotIt = false;
        username = string.Empty;
        password = string.Empty;
        IEnumerable<string> headerVals;
        if (actionContext.Request.Headers.TryGetValues("Authorization", out headerVals))
        {
            try
            {
                string authHeader = headerVals.FirstOrDefault();
                char[] delims = { ' ' };
                string[] authHeaderTokens = authHeader.Split(new char[] { ' ' });
                if (authHeaderTokens[0].Contains("Basic"))
                {
                    string decodedStr = SecurityHelper.DecodeFrom64(authHeaderTokens[1]);
                    string[] unpw = decodedStr.Split(new char[] { ':' });
                    username = unpw[0];
                    password = unpw[1];
                }
                gotIt = true;
            }
            catch { gotIt = false; }
        }

        return gotIt;
    }

そして、これがこのメソッドで使用されるヘッダーデータをデコードするためのコードです。

    public static string DecodeFrom64(string encodedData)
    {

        byte[] encodedDataAsBytes

            = System.Convert.FromBase64String(encodedData);

        string returnValue =

           System.Text.Encoding.ASCII.GetString(encodedDataAsBytes);

        return returnValue;

    }

ユーザー名とパスワードを取得したら、認証プロセスを実行し、適切なHTTPコードをクライアントに返して処理することができます。

2013年3月8日更新

MVC4インターネットアプリケーションのデフォルトのメンバーシッププロバイダーであるSimpleMembershipを使用してこれを実装する方法の詳細を説明するブログ投稿を作成しました。また、これを実装するダウンロード可能なVS2012プロジェクトも含まれています。

于 2013-01-03T14:43:11.987 に答える