トークン認証で説明していることを正確に実行するオープンソースのMVC4 WebAPI アプリケーションを作成しました。ここで見つけることができますWebAPISoup .
これはasp.net メンバーシップ プロバイダーではありません。カスタムのDelegatingHandlerを使用すると、リクエスト ヘッダーで有効なアプリ IDとトークンの値を検査し、データベース (最初に EF5 コード) に対して検証してから、リクエストの続行を許可するだけです。
mapHttpRouteでハンドラーを設定することにより、これをグローバルに処理するようにアプリケーションを構成します。
WebApiConfig.cs
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: null,
handler: HttpClientFactory.CreatePipeline(
new HttpControllerDispatcher(config),
new DelegatingHandler[] { new Pipeline.AuthMessageHandler() })
);
AuthMessageHandler
public class AuthMessageHandler : DelegatingHandler
{
private const string AppIdHeader = "AppId";
private const string AppTokenHeader = "AppToken";
protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
IEnumerable<string> appIdValues;
IEnumerable<string> appTokenValues;
HttpStatusCode responseCode = HttpStatusCode.OK;
Guid AppIdGuid;
var DoesHaveAppId = request.Headers.TryGetValues(AppIdHeader, out appIdValues);
var DoesHaveAppToken = request.Headers.TryGetValues(AppTokenHeader, out appTokenValues);
//Forces Json to be request Body type
request.Headers.Accept.Clear();
request.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
request.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json");
IPrincipal principal = null;
if (DoesHaveAppId && DoesHaveAppToken)
{
if (Guid.TryParse(appIdValues.FirstOrDefault(), out AppIdGuid))
{
principal = ValidateAuthentication(AppIdGuid, appTokenValues.FirstOrDefault());
if (principal != null) //Valid User
{
System.Threading.Thread.CurrentPrincipal = principal;
if (IsAppOverLimit(AppIdGuid))
{
responseCode = (HttpStatusCode)429;
}
}
else//User failed to authenticate
responseCode = HttpStatusCode.Unauthorized;
}
}
else//User didn't supply Key/Token
responseCode = HttpStatusCode.Forbidden;
return base.SendAsync(request, cancellationToken)
.ContinueWith(task =>
{
var response = task.Result;
if (responseCode == HttpStatusCode.OK)
return response;
else
return request.CreateResponse(responseCode);
});
}
}
トークン認証リクエストを処理するために作成した AuthMessageHandler は、こちらにあります。