Веб-API ASP.Net -Пустой заголовок авторизации

Мне нужно повторно -написать существующий REST API с использованием.NET (, изначально написанный на Ruby ). С точки зрения клиента, он должен работать точно так же, как старый API -, т. е. клиентский код не должен изменяться. Текущий API требует базовой аутентификации. Таким образом, для вызова старого API отлично работает следующее:-

        var wc = new System.Net.WebClient();
        var myCache = new CredentialCache();
        myCache.Add(new Uri(url), "Basic", new NetworkCredential("XXX", "XXX"));
        wc.Credentials = myCache;
        var returnBytes = wc.DownloadData("http://xxxx");

(Мне пришлось опустить настоящий URL-адрес/имя пользователя/пароль и т. д. по соображениям безопасности ).

Сейчас я пишу новый API, используя ASP.Net Web API с MVC4. У меня странная проблема, и я не могу найти никого с точно такой же проблемой. Чтобы поддерживать обычную аутентификацию, я следовал приведенным здесь рекомендациям :

http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/

. Во-первых, я поместил код для «перехвата в обработчике» в файле Global.asax.cs в событии Application _Start ()(это не было объяснено, поэтому я догадался ).

В любом случае, если я вызову свой API (, который я развернул в IIS )с помощью приведенного выше кода, заголовок авторизации всегда будет нулевым, а вышеописанное завершится ошибкой с кодом 401 Unauthorized. Однако, если я вручную устанавливаю заголовок с помощью этого кода, он работает нормально -, т. е. заголовок авторизации теперь существует, и я могу аутентифицировать пользователя.

    private void SetBasicAuthHeader(WebClient request, String userName, String userPassword)
    {
        string authInfo = userName + ":" + userPassword;
        authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
        request.Headers["Authorization"] = "Basic " + authInfo;
    }
  .......
    var wc = new System.Net.WebClient();
    SetBasicAuthHeader(request, "XXXX", "XXXX");
    var returnBytes = wc.DownloadData("http://xxxx");

Хотя это и работает, мне это не нужно, потому что существующие пользователи существующего API не будут вручную устанавливать заголовок.

Читая о том, как работает обычная аутентификация, первоначальный запрос должен быть анонимным, затем клиенту возвращается 401, после чего клиент должен повторить попытку. Однако, если я поставлю точку останова в своем коде, он больше никогда не попадет в код в примере Энтони. Я ожидал, что моя точка останова будет сбита дважды.

Есть идеи, как заставить это работать?

7
задан Kara 26 February 2014 в 18:41
поделиться