2010-09-12 4 views
2

Обновление: Я не могу удалить этот вопрос, потому что ответ был отменен, но это совсем не ответ на то, что я прошу. Я хотел бы удалить это, так как это была неделя без ответа, и это просто перетащить мой accept%. Благодарю.Основная страница ASP.NET MVC2 и аутентификация

У меня сильно типизированная главная страница, которая включает в себя информацию, которая основана на UserId в настоящее время одноразового пользователя:

(Guid)Membership.GetUser().ProviderUserKey 

Все остальное нормальное действие/представление будет требовать от пользователя пройти проверку подлинности до его просмотра, что означает, что информация пользователя будет доступна.

Проблема заключается в том, что я получаю только нулевые ссылочные исключения при попытке получить доступ к информации пользователя. с главной страницы сайта. Я предполагаю, что это связано с тем, что атрибут [Авторизовать] не применяется к основным страницам.

Есть ли у меня это неправильно? Есть ли еще одна причина?

Простой пример:

различные страницы моего сайта все использовать вид модели объекта, который наследует модель представления страницы мастера:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<Models.MasterViewModel>" %> 

опознанный объект пользователя является свойством этой базовой модели представления. Для всех страниц требуется аутентификация, поэтому любой, кто не является, перенаправляется в окно входа в систему, которое работает безупречно. Так простая попытка использовать собственность пользователя в представлении, таким образом:

<%= Model.UserName %> 

который я помещу в одном из видов, а также в мастер зрения сайта.

Когда пользователь уже прошел аутентификацию, все работает так, как должно, при этом имя пользователя дважды печатается на странице. Когда истекает срок действия авторизационного билета или появляется новый пользователь, страница не будет перенаправляться на вход в систему, но вместо этого генерирует исключение, которое жалуется на нулевую ссылку, исходящую от <% = Model.UserName%> в главном представлении ,

Когда я удаляю <% = Model.UserName%> из главного представления и оставляю его в нормальном представлении, он перенаправляет, как следует, без выброса ошибки.

Надеюсь, это несколько более понятно.

Edit:

Может быть кто-то может предложить лучший способ получить доступ к информации, прошедшего проверку подлинности пользователя на главной странице?

Edit # 2:

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

Update:

Я не принял ответ, потому что я хорошо знаком с тем, как я могу проверить, является ли или не проходит проверку подлинности пользователя. Мне любопытно узнать, почему не происходит перенаправления на страницу входа в систему.

ответ

1

Единственный способ, которым я смог воспроизвести эту ошибку, если я добавить нарушающую кодоблок к MasterPage, на который ссылается из страниц, которые не требуют аутентификации, то выглядят at'em без входа в систему.

Если ваша главная страница не используется на вашей странице входа в систему, это может означать, что что-то еще не совсем на месте. Как настроена ваша маршрутизация и аутентификация? Если ваш просмотр получает экземпляр перед перенаправлением, то и ваша главная страница, что может спровоцировать это поведение.

+0

У меня есть атрибут [Авторизовать] на базовом контроллере, из которого наследуются все остальные контроллеры, и я считаю, что моя маршрутизация звучит. «Что-то еще не совсем на месте», было и остается тем, что, как я подозреваю, является причиной, я просто не могу его найти. Благодарю. – asfsadf

+1

На главной странице нарушения добавьте строку <% = this.ViewContext%>, затем щелкните правой кнопкой мыши и «Точка останова» -> «Вставить точку останова». Затем проверьте ViewContext, укажите указатели, на которых был загружен View View. –

+0

Я не могу понять это, чтобы спасти свою жизнь, но я собираюсь отметить это как «ответ» и двигаться дальше. Спасибо за помощь. – asfsadf

2

Это не из-за главной страницы.

Membership.GetUser() вернет текущего пользователя членства в системе. Если ни один пользователь не выполнил вход в систему, он вернет значение null, и это вызывает проблемы.

Вы можете использовать оператор if на своей главной странице, чтобы проверить, вошел ли пользователь в систему или нет, прежде чем использовать информацию о пользователе.

if(Membership.GetUser() != null) 
{ 
    // Use User Info. 
} 
+0

спасибо. Дело в том, что обычно, если пользователь еще не аутентифицирован, он будет перенаправлен на страницу входа, тогда как это просто выдает исключение и не перенаправляет перенаправление. – asfsadf

+0

Если вы используете свою основную страницу на других страницах, к которым пользователи, не прошедшие проверку подлинности, имеют доступ (например, страницу входа), тогда да, вам нужно будет проверить. –

+0

Если вы считаете, что проверка информации о пользователях в вашем представлении затруднит ситуацию, вы можете создать помощника, чтобы сделать вашу жизнь проще. другое решение имеет две основные страницы. один для страниц, к которым обращаются аутентифицированные пользователи, которые содержат информацию о пользователях. и еще один для страниц, к которым неавторизованные пользователи имеют доступ к которым не содержит информацию о пользователях. –

0

не уверен, если это все еще применяется в MVC2, но вы пробовали определение атрибута loginUrl в вашем web.config?

<authentication mode="Forms"> 
<forms loginUrl="/user/login" /> 
</authentication> 

<authorization> 
<deny users="?" /> 
</authorization> 
+0

У меня есть, но спасибо в любом случае , – asfsadf