Устранение неполадок при проверке подлинности ASP.NET

StackOverflow https://stackoverflow.com/questions/1402568

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня довольно сложное веб-приложение, созданное (подрядчиком) для использования встроенной аутентификации. В процессе аутентификации используется функция GetNetworkID () , которая выглядит следующим образом:

private string GetNetworkID()
{
    return HttpContext.Current.User.Identity.Name.Split(new char[] { '\\' })[1];
}

Когда я запускаю это в моем окне разработки, значение HttpContext.Current.User.Identity.Name myNetwork \\ myUserID , поэтому вышеприведенная функция возвращает мой идентификатор пользователя, как и предполагалось, и процесс аутентификации работает просто отлично.

Но когда я запускаю это на своем веб-сервере, я получаю сообщение об ошибке Index за пределами массива , выдаваемой оператором return в функции GetNetworkID () .

Я немного растерялся из-за того, как решить эту проблему и выяснить, является ли это проблемой конфигурации IIS (мой веб-сервер - это Windows Server 2008, работающая под управлением IIS 7) или что-то еще.

Если я жестко закодировал свой идентификатор пользователя в качестве возвращаемого значения для функции GetNetworkID () , он работает на веб-сервере, но у меня нет особых идей о том, как отлаживать на веб-сервер, чтобы определить, какое возвращаемое значение HttpContext.Current.User.Identity.Name вызывает ошибку индексации массива.

Есть предложения?

Это было полезно?

Решение

IIS работает как учетная запись службы IIS, поэтому Current.User.Identity, вероятно, будет именем учетной записи IIS.

Для полноты картины вы должны проверять '\' либо с помощью Find (), либо вызывая split, и проверяя длину результирующего массива. Если длина равна 1, это означает, что идентификатор не имеет вид домен \ имя пользователя.

В общем, если вы хотите выполнить отладку, вы можете записать любое значение в поток HTTP-ответов, например, так:

Response.Write(HttpContext.Current.User.Identity.Name)

Другой способ - установить переменную страницы ASP и установить для переменной страницы значение, которое вы хотите проверить. Вы можете отобразить значение переменной либо через код ASP, либо через Javascript.

Другие советы

Возможно, вам не хватает настройки IIS.

Попробуйте в IIS: Сайт (правый клик) | Свойства | Безопасность каталогов (вкладка)

Нажмите кнопку "Изменить ..."

Затем выберите " Интегрированная проверка подлинности Windows "

Я думаю, что пользователь, который входит в ваше веб-приложение на другом сервере, не является действительным логином. И, следовательно, результат не возвращается для User.Identity.Name.

Как вы сказали, это работает, когда вы жестко закодировали имя пользователя. Это означает, что пользовательские кредитные коды компьютера, который вы используете для входа, на вашем сайте запрещены. Поэтому это должно отличаться от учетных данных, которые вы жестко кодируете.

Лучше всего отлаживать на веб-сервере (это не сложно - все, что вы хотите вернуть, это User.Identity.Name, и вы можете получить имя пользователя и логическую схему оттуда), а также проверить содержимое в вашей сети. Файл .config.

Как отметил Алан (и я за него проголосовал), вы, вероятно, захотите добавить проверку того, какую форму принимает User.Identity.Name . Например, обновленная процедура может выглядеть следующим образом:

private string GetNetworkID()
{
    var name = HttpContext.Current.User.Identity.Name;
    return name.InStr("\\") > -1 ? name.Split("\\")[1] : name;
}

Это вернет вторую часть имени для входа в систему, если присутствует \ , и полную строку, если нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top