web-dev-qa-db-ja.com

Web.APIのカスタム認証

ASP.NET MVCの私の理解は、承認には次のようなものを使用する必要があるということです-

_public class IPAuthorize : AuthorizeAttribute {

protected override bool AuthorizeCore(HttpContextBase httpContext) {
    //figure out if the ip is authorized 
    //and return true or false
}
_

ただし、Web APIにはAuthorizeCore(..)はありません。

OnAuthorization(..)があり、MVCの一般的なアドバイスはOnAuthorization(..)を使用しないことです。

Web APIのカスタム認証には何を使用すればよいですか?

27
tom

私は反対に全く同意しません-

承認は承認フィルターで行われます。つまり、System.Web.Http.AuthorizeAttributeから派生し、IsAuthorizedメソッドを実装します。

パイプラインで許可フィルターよりも後で実行されるため、通常のアクションフィルターには許可を実装しません。

また、フィルターに認証を実装しません(JWTの解析など)-これは、MessageHandlerと呼ばれる拡張ポイントでさらに早く行われます。

44
leastprivilege

使用するメソッドは、System.Web.Http.AuthorizeAttributeを継承するカスタムApiAuthorize属性です。例えば:

public class ApiAuthorizeAttribute : AuthorizeAttribute
{
    readonly CreditPointModelContext _ctx = new CreditPointModelContext();

    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        if(Authorize(actionContext))
        {
            return;
        }
        HandleUnauthorizedRequest(actionContext);
    }

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
        challengeMessage.Headers.Add("WWW-Authenticate", "Basic");
        throw new HttpResponseException(challengeMessage);

    }

    private bool Authorize(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        try
        {
            //boolean logic to determine if you are authorized.  
            //We check for a valid token in the request header or cookie.


        }
        catch (Exception)
        {
            return false;
        }
    }
}
11
Gareth Suarez