基本認証を使用して、承認用の資格情報を渡します。これにより、クレデンシャルがヘッダーに配置されます。これを行うには、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プロジェクトも含まれています。