Это старый вопрос, но эта ошибка внезапно начала появляться в наших собственных приложениях вчера, после исправления Microsoft Security.
Причина заключалась в том, что у нас были некоторые сайты, работающие на IIS, и их пулы приложений настроены для работы под учетной записью NetworkService
. До вчерашнего дня без проблем все нормально работало. Но после патча почти все наши пользователи получали ошибки «401 Unauthorized».
Для этого есть три решения:
- измените веб-сайт для работы под учетной записью "реального" пользователя и убедитесь, что у этого пользователя есть разрешение на чтение файлов в папке IIS этого сайта. Другими словами, щелкните правой кнопкой мыши эту папку, выберите вкладку «Безопасность» и добавьте разрешения для этого пользователя.
- измените разрешения для папки веб-сайта и убедитесь, что
YOURCOMPUTERNAME\Users
имеет разрешение на доступ к этой папке. Да, это реальная учетная запись, и мы подозреваем, что исправление Microsoft фактически удалило эти разрешения.
- оставьте для пула приложений веб-сайта значение
NetworkService
, но, опять же, убедитесь, что пользователи, которые будут использовать этот веб-сайт do имеют права на чтение файлов в папке IIS этого сайта. Итак, у нас была группа Active Directory, содержащая пользователей, которые будут использовать этот веб-сайт, поэтому мы добавили эту группу AD на вкладку Безопасность папки и убедились, что они могут получить доступ к файлам.
Опять же, странно, что наши сайты прекрасно работали до этого патча.
И на всякий случай, если кто-нибудь еще столкнется с этой проблемой в 2017 году, мне также пришлось добавить одну строку кода C #, чтобы использовать «UseDefaultCredentials
» в моей функции для вызова веб-службы. Опять же, до патча Microsoft эта строка не существовала и работала нормально. Но после патча мы получили 401 ошибку, пока я не добавил эту строку.
public string CallWebService(string URL)
{
HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(URL);
objRequest.Method = "GET";
objRequest.KeepAlive = false;
objRequest.UseDefaultCredentials = true;
HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
string result = "";
using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
{
result = sr.ReadToEnd();
sr.Close();
}
return result;
}
Надеюсь, это поможет.