カスタムAuthorizeAttributeを作成して、基本認証を使用して認証と承認の両方を処理できます。この属性はフィルターとして機能し、コントローラー アクションまたは Web API メソッドに到達する前に要求を処理します。オーバーライドされたOnAuthorizeメソッドでは、ヘッダー情報を取得して認証を実行できます。
ajax を使用してコントローラーまたは Web API メソッドに要求を行う場合は、基本認証を使用して認証用の資格情報を渡します。これにより、資格情報がヘッダーに配置されます。これを行うには、JQuery ajax関数のbeforeSendイベント ハンドラーを使用すると非常に簡単です。jquery.base64.js を使用して、送信される情報をエンコードします。これを行う方法の例を次に示します。
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 を使用する必要があります。
サーバー側では、ヘッダーから資格情報を取得し、それらをデコードし、認証/承認プロセスを実行するカスタムAuthorizeAttributeを作成できます。コントローラーとは対照的に、Web API によって使用されるaaa 個別のAuthorizeAttributeがあることに注意してください。カスタムAuthorizeAttributeを作成するときは、 System.Web.Http.AuthorizeAttributeを基本クラスとして使用してください。Web API を使用している場合。それらは異なる動作をします。コントローラー用のものはログオン ページにリダイレクトする必要がありますが、Web API 用のものは成功または失敗を示す HTTP コードを返します。クライアントがそれに応じて反応できるように、認証ではなく認証による失敗を認証が区別できない場合は、Forbidden の HTTP コードを返します。
カスタム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;
}
ユーザー名とパスワードを取得したら、SimpleMembership プロバイダーを使用して認証と承認を実行できます。