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