Web.API中的自定义授权

tom*_*tom 27 c# asp.net-mvc authorization asp.net-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
}
Run Code Online (Sandbox Code Playgroud)

但在Web API中,没有AuthorizeCore(..).

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

我应该在Web API中使用什么来进行自定义授权?

lea*_*ege 44

我根本不同意对立面 -

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

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

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

  • 经过审核,我完全同意.我将放弃我的答案,以便正确的一个流向顶部.其他人投票支持删除,因此可以将其删除.;-) (6认同)
  • +1这是使用System.Web.Http.AuthorizeAttribute的正确答案.勉强使用actionfilter进行授权的唯一原因是,如果您需要访问反序列化的邮件正文以进行授权决策,但这很少是需要或良好实践. (3认同)

Gar*_*rez 11

我们使用的方法是一个自定义的ApiAuthorize属性,它继承自System.Web.Http.AuthorizeAttribute.例如:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您不应该覆盖OnAuthorization - 因为您将缺少[AllowAnonymous]处理. (9认同)
  • 怎么样的apis提供重置密码,注册等匿名服务? (8认同)
  • @Pushpendra允许匿名的目的是您可以将authorize属性分配给控制器,然后允许匿名处理您要从授权中排除的方法.否则,您需要在每个操作上使用authorize属性 (7认同)
  • 我认为你首先授权的原因是不允许匿名.叫我疯了,但这没有任何意义. (4认同)
  • @mare请勿使用授权属性进行此类调用!! (3认同)