27

我对 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(..).

MVC的OnAuthorization(..)一般建议是不要使用OnAuthorization(..).

Web API 中的自定义授权应该使用什么?

4

2 回答 2

44

授权在授权过滤器中完成 - 这意味着您从 System.Web.Http.AuthorizeAttribute 派生并实现 IsAuthorized 方法。

您不会在普通操作过滤器中实现授权,因为它们在管道中运行的时间比授权过滤器晚。

您也不会在过滤器中实现身份验证(如解析 JWT)——这甚至在更早的称为 MessageHandler 的扩展点中完成。

于 2013-03-01T08:33:12.500 回答
11

我们使用的方法是继承自 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;
        }
    }
}
于 2013-03-01T14:42:15.960 回答