У меня есть постоянно запланированное веб-задание, которое отслеживает очередь сообщений, извлекает сообщения и вызывает веб-API на равноправном веб-сайте для обработки сообщений (в данном случае с помощью SignalR для отправки уведомлений соответствующим пользователям).
Как в этом случае лучше всего безопасно вызывать веб-API? В противном случае API, размещенный на веб-сайте, явно выставлен напоказ. Возможно, что-то использует Basic Auth или сохраняет токен безопасности в конфигурации и передает его из задания в веб-API. Или создать собственный AuthorizeAttribute?
Мы будем очень признательны за мысли Ant о защите вызова Web API из WebJob. API должен вызываться только из веб-задания.
ОБНОВЛЕНИЕ: что-то вроде этого?
Сначала я объявляю этот класс;
public class TokenAuthenticationHeaderValue : AuthenticationHeaderValue
{
public TokenAuthenticationHeaderValue(string token)
: base("Token", Convert.ToBase64String(Encoding.UTF8.GetBytes(token)))
{ }
}
Затем вызывающая сторона (веб-задание) использует этот класс для установки заголовка аутентификации при выполнении HTTP-запроса;
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(/* something */);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new TokenAuthenticationHeaderValue("TOKEN FROM CONFIG");
// ....
В веб-API мы проверяем запрос в поисках ожидаемого токена в заголовке аутентификации, в настоящее время код довольно уродлив, но его можно поместить в настраиваемый атрибут;
public HttpResponseMessage Post([FromBody]TheThing message)
{
var authenticationHeader = Request.Headers.Authorization;
var token = Encoding.UTF8.GetString(Convert.FromBase64String(authenticationHeader.Parameter));
if (authenticationHeader.Scheme != "Token" || token != "TOKEN FROM CONFIG")
{
return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "No, no, no. That's naughty!");
}
// All OK, carry on.
Таким образом, веб-задание вызывает веб-API на одноранговом веб-сайте, а безопасность достигается за счет передачи маркера, который надежно хранится в конфигурации Azure, и сайт, и задание имеют доступ к этому маркеру.
Есть идеи получше?