Безопасный вызов веб-API, размещенного на веб-сайте, из веб-задания Azure.

У меня есть постоянно запланированное веб-задание, которое отслеживает очередь сообщений, извлекает сообщения и вызывает веб-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, и сайт, и задание имеют доступ к этому маркеру.

Есть идеи получше?


person Stuart Hallows    schedule 06.05.2014    source источник
comment
Вы нашли лучшее решение?   -  person Ricardo Polo Jaramillo    schedule 19.05.2014


Ответы (1)


Похоже, обычная аутентификация подойдет для вашего сценария.

Отличный учебник здесь: Базовая аутентификация

person Brendan Green    schedule 06.05.2014