Устранение неполадок при проверке подлинности ASP.NET - PullRequest
0 голосов
/ 10 сентября 2009

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

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

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 10 сентября 2009

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

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

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

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

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

2 голосов
/ 10 сентября 2009

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

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

Нажмите «Редактировать ...»

Затем выберите «Интегрированная аутентификация Windows»

1 голос
/ 10 сентября 2009

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

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

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

1 голос
/ 10 сентября 2009

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

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

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

...