Web Api拦截器

时间:2018-11-16 05:54:22

标签: c# .net asp.net-web-api interceptor

我已经在Web api上创建了一个自定义授权属性。我的目标是检查用户是否有权直接访问Web api URL,否则将其重定向到未经授权的页面。此过程要求我到处添加[CustomAuthorize(“ modulename”)]。还有其他方法可以做到这一点?可能是拦截器?任何指导都将不胜感激。

         Customised authorize attribute pseudo code snippet: 

        public override void OnAuthorization(HttpActionContext context){
                var username = HttpContext.Current.Request.LogonUserIdentity.Name;
                 var  accesiblemodulelistforuser = GetPermissions(username );

                if (user != null)
            {
                if (modulename does not exist in list )
                {
                var response = 
                context.Request.CreateResponse(HttpStatusCode.Forbidden);
                    context.Response = response;

                }
           else{
          return;

                }

                  }
              else{
                        //redirect to unauthorized page
                  }
              }

1 个答案:

答案 0 :(得分:1)

您的两个ASP.NET版本都没有类定义,因此我假设您继承了ActionFilterAttribute。只是注意到,您不是。查看修改后的版本。如果是这样,那么您可以像这样在WebApiConfig.cs中为所有Web api操作和控制器全局注册过滤器:

public static void Register(HttpConfiguration config)
{
    config.Filters.Add(new CustomAuthorize());
}

修改

完全误解了您的处境。因此,有更多信息。 您可以使用自己的全局授权过滤器:

public class CustomAuthorize : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            // user not authorized, redirect to login page
            filterContext.Result = new HttpUnauthorizedResult();

            return;
        }

        string roleName = GetModuleName(filterContext);
        var user = filterContext.HttpContext.User;


        // Chaeck user permissions
        if (!user.IsInRole(roleName))
        {
            // Handle not authorized requests and redirect to error page
            filterContext.Result = new RedirectResult("~/Error/NotAuthorized");
            return;
        }

        base.OnAuthorization(filterContext);
    }

    string GetModuleName(AuthorizationContext filterContext)
    {
        var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerType.FullName;
        var actionName = filterContext.ActionDescriptor.ActionName;

        return controllerName; // or actionName
    }
}

您可以像这样在WebApiConfig.cs中为所有动作和控制器全局注册过滤器:

public static void Register(HttpConfiguration config)
{
    filters.Add(new CustomAuthorize());
}

或仅在特定的控制器/动作上使用。

请小心,此方法不适用于Web api,仅适用于mvc,因为Web api在AuthorizeAttribute中拥有自己的System.Web.Http(MVC版本位于System.Web.Mvc中)。实现略有不同,但是您可以查找示例。因此,您将需要具有不同的属性-一个用于MVC,另一个用于WEB API。请参阅原始答案,以了解如何全局注册WEB API过滤器,或仅将其用于特定控制器。