#iis #amazon-ec2 #hangfire
#iis #amazon-ec2 #hangfire
Вопрос:
Мое приложение Asp Net Core размещено на Amazon EC2 с использованием IIS. Я добавил авторизацию HangFire, внедрив IDashboardAuthorizationFilter. Мое клиентское приложение — это приложение Angular. С моего контроллера (на стороне сетевого ядра Asp) я передаю токен-носитель в файл cookie с ответом.Перенаправление на URL панели мониторинга Hangfire.
В локально размещенном приложении оно работает отлично, и мой метод авторизации в моей реализации фильтра авторизации передает файл cookie в запросе. Кроме того, панель управления HangFire отображается в браузере на той же вкладке.
Однако в среде prod / qa есть 2 проблемы:
- Исходный запрос GET, отправленный с клиента на мой контроллер API, возвращается со статусом 302, а последующий запрос на URL-адрес hangfire становится запросом GET вместо перенаправления. Он начинает анализировать html (из hangfire) и выдает ошибку в консоли разработчика.
- Мой метод авторизации панели управления HangFire получает запрос без cookie, который я установил в своем API контроллера, прежде чем перенаправлять на URL-адрес hangfire.
Пожалуйста, посмотрите мой код ниже:
MyAuthorizationFilter.cs
public class MyAuthorizationFilter: IDashboardAuthorizationFilter {
public bool Authorize(DashboardContext context) {
try {
var httpContext = context.GetHttpContext();
// If it is a request for localhost, allow it straightaway
if (httpContext.Request.Host.ToUriComponent().Contains(Constants.Localhost)) {
return true;
}
string accessToken = httpContext.Request.Cookies[Constants.HangFireTokenKey];
LogHelper.ApiLog("Access Token: " accessToken, LoggerLevel.DEBUG);
if (string.IsNullOrEmpty(accessToken)) {
return false;
}
ClaimsPrincipal claimsPrincipal = Utils.ValidateToken(accessToken);
LogHelper.ApiLog("Claims Principal Claims: " JsonConvert.SerializeObject(claimsPrincipal.Claims), LoggerLevel.DEBUG);
LogHelper.ApiLog("Allowed users: " JsonConvert.SerializeObject(this._allowedUsers));
if (claimsPrincipal != null) {
string userEmail = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == "email")?.Value;
if (this._allowedUsers.Contains(userEmail)) {
return true;
}
}
return false;
} catch (Exception){
LogHelper.ApiLog("HangFire Exception:" e);
return false;
}
}
MyController.cs API
[HttpGet("hangfireDashboard")]
public void ShowHangFireDashboard() {
try {
string token = Request.Headers["Authorization"];
if (null != token) {
// Set our Bearer token as a cookie for Dashboard redirect
// Hangfire sends this cookie to Authorize method of DashBoardAuthorizationFilter
Response.Cookies.Append(Constants.HangFireTokenKey, token, new CookieOptions { Expires = DateTime.Now.AddMinutes(Constants.HangFireCookieExpiryTimeInMinutes) });
Response.Redirect(this._configuration["HangFire:DashboardUrl"]);
}
} catch (Exception) {
throw;
}
}
My Angular Client side function - GET request to my hangfireDashboard API
/**
* Send request for HangFire Dashboard
*/
showHangFireDashboard() {
const apiUrl = this._apiUrl Global.route.hangfireDashboard;
return this._httpClient.get(apiUrl);
}
Первоначальный запрос GET от моего клиента на мой сервер
Следующее должно было появиться как перенаправление, а не запрос на получение
Предварительный просмотр приведенного выше запроса (/ hangFire), который должен был появиться как перенаправление, а не получить
[Обновлено]: консоль разработчика показывает ошибку, поскольку она должна проанализировать html-тег, который пришел в ответ на запрос GET от Hangfire (это должно было быть перенаправлением вместо GET)
Комментарии:
1. Можете ли вы показать мне ошибку в консоли разработчика? и вы можете использовать Fiddler для просмотра процесса вашего запроса.
2. @samwu Я обновил свой вопрос с ошибкой, которая появляется в консоли разработчика. На самом деле ошибка связана с синтаксическим анализом тегов HTML, поскольку веб-страница была отправлена в ответ на запрос GET (я надеялся получить ее как перенаправление, а не ПОЛУЧИТЬ)
3. Вы указали тип ответа? HttpClient по умолчанию преобразует ответ в response.json() , я думаю, это также может вызвать ошибку в консоли.