Web Api Interceptor - PullRequest
       6

Web Api Interceptor

0 голосов
/ 16 ноября 2018

Я создал собственный атрибут авторизации на своем веб-интерфейсе 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 голосов
/ 16 ноября 2018

В вашей версии ASP.NET нет определения класса, поэтому я предполагаю, что вы наследуете ActionFilterAttribute class .Просто заметил, что это не так.Смотрите отредактированную версию .Если это так, то вы можете зарегистрировать свой фильтр глобально для всех действий и контроллеров веб-API в WebApiConfig.cs следующим образом:

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());
}

или использовать только вопределенные контроллеры / действия.

Только будьте осторожны, этот подход не работает для веб-API, только для MVC, поскольку у веб-API есть свой собственный AuthorizeAttribute, расположенный в System.Web.Http (версия MVC находится в System.Web.Mvc),Реализация немного отличается, но вы можете просто искать примеры.Таким образом, вам понадобятся атрибуты who - один для MVC и один для WEB API.См. Оригинальный ответ, чтобы узнать, как зарегистрировать веб-фильтр глобально или использовать его только для определенных контроллеров.

...