API со статусом 401, возвращающим страницу входа в систему

Я создал POST API под UmbracoApiController.

    [HttpPost]
    [ActionName("SaveData")]       
    public HttpResponseMessage SaveData([FromBody]JObject data)
    {
      if (!authorized)
        {             
            return Request.CreateResponse(HttpStatusCode.Unauthorized, 
                      "Unauthorized access. Please check your credentials");
        }
    }

Вместо возврата 401 он переходит на страницу входа со статусом 302.

Я также создал настраиваемый атрибут -

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class BasicAuthorization : AuthorizationFilterAttribute
{
    private const string _authorizedToken = "Authorization";

    public override void OnAuthorization(HttpActionContext filterContext)
    {
        var authorizedToken = string.Empty;

        try
        {
            var headerToken = filterContext.Request.Headers.FirstOrDefault(x => x.Key == _authorizedToken);
            if (headerToken.Key != null)
            {
                authorizedToken = Convert.ToString(headerToken.Value.SingleOrDefault());
                if (!IsAuthorize(authorizedToken))
                {
                    var httpContext = HttpContext.Current;
                    var httpResponse = httpContext.Response;

                    filterContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
                    {
                        Content = new StringContent("Unauthorized access. Please check your credentials")
                    };

                    httpResponse.StatusCode = (int) HttpStatusCode.Unauthorized;
                    httpResponse.SuppressFormsAuthenticationRedirect = true;
                    return;
                }                    
            }
            else
            {
                filterContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
                return;
            }
        }
        catch (Exception)
        {
            filterContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
            return;
        }

        base.OnAuthorization(filterContext);
    }

    private static bool IsAuthorize(string authorizedToken)
    {
        return authorizedToken == ConfigurationManager.AppSettings["VideoIngestionKey"];
    }
}

Но это тоже не работает. Я использую Umbraco 7.6.13.

Любая помощь очень ценится.

Спасибо


person Harsheet    schedule 08.08.2018    source источник
comment
Сам веб-сервер выполняет перенаправление? Я не вижу атрибут авторизации на контроллере. Это на уровне класса?   -  person Crowcoder    schedule 08.08.2018
comment
Умеете ли вы отлаживать код API?   -  person Chetan Ranpariya    schedule 08.08.2018
comment
@Crowcoder Это базовая авторизация с помощью ключа. Если ключ не совпадает, я хочу вернуть 401. Но вместо этого он возвращает 302 с перенаправлением страницы входа   -  person Harsheet    schedule 08.08.2018
comment
@ChetanRanpariya Да, я использую скрипач, чтобы проверить это.   -  person Harsheet    schedule 08.08.2018
comment
Fiddler бесполезен для отладки. Вы поставили точку останова в коде и запустили код в режиме отладки, а затем сделали запрос к API? Наткнулся ли он на точку останова в коде, особенно в методе SaveData?   -  person Chetan Ranpariya    schedule 08.08.2018
comment
@ChetanRanpariya Да, и в Fiddler я могу легко увидеть ответ. Данные также сохраняются корректно. Единственная проблема с несанкционированным доступом.   -  person Harsheet    schedule 08.08.2018


Ответы (1)


Есть что-то похожее, но используемое с контроллером Surface, а не с контроллером веб-API.

Переопределите HandleUnauthorizedRequest для реализации пользовательского ответа / переопределите значения по умолчанию Umbraco и .NET.

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        // example redirects to a 'Forbidden' doctype/view with Reponse.StatusCode set in view; 
        filterContext.Result =
            new RedirectToUmbracoPageResult(
                UmbracoContext.Current.ContentCache.GetSingleByXPath("//forbidden"));
    }

Странно, что проверка подлинности с помощью форм срабатывает и перенаправляет вас на страницу входа для запроса API. AuthorizationFilterAttribute должен по умолчанию возвращать Http 401 (поэтому можно работать с разделами web.config customErrors или httpErrors вместо кода).

Хотите просмотреть настройки web.config?

person Gavin Faux    schedule 08.08.2018
comment
Возможно, ссылка в 1-м комментарии на stackoverflow.com/questions/11087677/ относятся к вам? - person Gavin Faux; 08.08.2018