Существует библиотека аутентификации, что я должен использовать, что услужливо делает такие вещи, какКак очистить существующий ответ в 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. Как я могу это сделать?