2016-05-06 2 views
0

Существует библиотека аутентификации, что я должен использовать, что услужливо делает такие вещи, какКак очистить существующий ответ в webapi?

Response.Redirect(url, false); 

внутри это вызовы метода. Я не могу изменить этот код библиотек, и это отлично подходит для приложений стиля MVC, но в угловых SPA -> приложениях WebApi это просто ужасно.

Мне действительно нужно 401, в противном случае у меня возникают проблемы с CORS, когда мои угловые скрипты, используя $ http, пытаются вызывать на сервере auth в другом домене в ответ на 302, то есть, если он даже может быть как Response.Redirect также отправляет вниз object moved html, а угловые скобки вызывают ошибку.

Поскольку я должен сначала позвонить в библиотеку auth, Response.Redirect уже находится в конвейере ответа, поэтому мне нужно очистить его, чтобы удалить содержимое тела и преобразовать 302 в 401. Я думал, что могу просто :

return new HttpWebResponse(StatusCode.UnAuthorized){ 
     Content = new StringContent("data"); 
} 

, но это только добавляемый к ответу и не заменяет его плюс мне нужно Расположение: заголовок, который я не могу получить доступ с помощью методов WebAPI.

Так вместо этого я должен был сделать это в моем ApiController:

var ctxw = this.Request.Properties["MS_HtpContext"] as HttpContextWrapper; 
var ctx = ctxw.ApplicationInstance.Context; 
var url = ctx.Response.RedirectLocation; 
ctx.Response.ClearContent(); 

    return new HttpWebResponse(StatusCode.UnAuthorized){ 
      Content = new StringContent(url); 
    } 

Но это кажется ужасным и противоречит WebAPI «чувствовать». Плюс к этому я привязана к контроллеру. Я не могу получить обертку в MessageHandler, например.

Что бы я хотел сделать, это следить за ответом для заданного маршрута в обработчике сообщений или в атрибуте AuthorizationFilterAttribute, если его 302, я хочу прочитать его заголовки, взять то, что хочу, стереть и заменить его с моим собственным «свежим» ответом как 401. Как я могу это сделать?

ответ

0

Вы можете написать свой собственный ActionFilter и переопределить его OnActionExecuted метод, где вы можете получить доступ к HttpActionExecutedContext. Оттуда вы можете проверить код ответа, например, и перезаписать ответ так, как хотите.

Ссылка: https://msdn.microsoft.com/en-us/library/system.web.http.filters.actionfilterattribute.onactionexecuted%28v=vs.118%29.aspx#M:System.Web.Http.Filters.ActionFilterAttribute.OnActionExecuted%28System.Web.Http.Filters.HttpActionExecutedContext%29

Смежные вопросы