Web.API中的自定义授权

时间:2013-03-01 00:03:03

标签: c# asp.net-mvc asp.net-web-api authorization

我对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中使用什么来进行自定义授权?

2 个答案:

答案 0 :(得分:44)

我完全不同意对立面 -

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

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

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

答案 1 :(得分: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;
        }
    }
}