2009-09-09 4 views
0

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

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

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

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

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

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

Любые предложения?

+0

Это то, что вы можете отлаживать или войти на вашей машине Если,.? Например, HttpContex t.Current.User.Identity.Name - это нечто неожиданное, например ASPNET, то это может быть проблема конфигурации IIS на вашем поле. –

+0

Спасибо, Дэвид - как я уже сказал, он работает на моей машине (и я использую VS & Cassini, поэтому у меня нет никакой конфигурации IIS). Разумеется, у меня IIS на сервере, но у него самые общие настройки из коробки, и мои попытки настроить аутентификацию с этой целью были безуспешными. – theog

+0

Редактировать: Я должен упомянуть, что я пробовал метод Response.Write для устранения неполадок несколькими способами. Это немного запутанно, потому что в коде аутентификации задействован ряд других шагов, но похоже, что вместо моего идентификатора пользователя он возвращает мое имя («Joe Blow»). Итак, да, может, я просто ответил на свой вопрос там ... Позвольте мне немного поработать над этим. – theog

ответ

2

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

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

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

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

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

+0

Это полезно, спасибо Алан. – theog

+0

Хорошо, поэтому Алан выигрывает приз, и я сам управляю наркотиками, чтобы не получить прозрение. Как оказалось, на моей локальной машине HttpContext.Current.User.Identity.Name - MyNetwork \\ MyUserID. На сервере значение «Joe Blow». Не знаю, почему; не знаю, как я буду бороться с этим, но это то, что бросает ошибку индекса массива. Спасибо вам всем за ваше время и не позвоните мне, чтобы я был на коленях. – theog

+0

Получил это исправление, и это была простая настройка. Как оказалось, я рассматривал только методы аутентификации IIS для каталога приложений, пытаясь выполнить разные настройки без каких-либо успехов. Возвращаемое значение «Joe Blow» происходило с анонимной аутентификацией, вызвавшей исключение индекса массива. Все другие методы аутентификации дали мне ответ 401. Оказывается, что проверка подлинности Windows на уровне сервера была отключена и настроена так, чтобы дать пользователю ответ 401. Как только я включил проверку подлинности Windows на уровне сервера, он работал как champ - исключение индекса массива и успешная аутентификация. – theog

1

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

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

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

+0

Спасибо вам за помощь, waqasahmed. – theog

2

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

Попробуйте в IIS: Веб-сайт (щелкните правой кнопкой мыши) | Недвижимость | Безопасность каталога (вкладка)

Нажмите «Изменить ..."

Затем выберите„Комплексная проверка подлинности Windows“

+0

И отключите другие формы аутентификации. –

+0

Спасибо Destructr ... Не уверен, если я доверяю вам такое имя пользователя. :) Серьезно, хотя, я сделал галку с безопасностью каталога и пробовал все комбинации параметров аутентификации в IIS. Не повезло. Я думаю, что Алан заставил меня идти в правильном направлении. Благодарю. – theog

+0

Destructr, процесс включения WIA немного отличается в IIS 7, но это то, что по существу устранило мою проблему. WIA был отключен на уровне родительского каталога над каталогом моего приложения. – theog

1

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

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

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

+0

Отлично, спасибо Томас. – theog

Смежные вопросы