2010-09-12 116 views
2

更新:我不能刪除這個問題,因爲答案已經upvoted,但它根本不是我所問的答案。我想刪除這個,因爲它已經有一週沒有答案了,只是拖拽我的接受%。謝謝。ASP.NET MVC2母版頁和身份驗證

我有一個強類型的母版頁包含基於目前已驗證的用戶的用戶ID信息:

(Guid)Membership.GetUser().ProviderUserKey 

每隔正常動作/視圖會要求用戶它正在觀看之前被驗證,這意味着用戶的信息保證可用。

問題是,當我嘗試訪問用戶的信息時,我只收到空引用異常。來自網站的母版頁。我猜這是因爲沒有適用於母版頁的[Authorize]屬性。

我有這個錯嗎?是否有另一個可能的原因?

簡單的例子:

我的網站的各個頁面都使用繼承母版頁視圖模型視圖模型對象:

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

通過身份驗證的用戶對象是在此基礎視圖模型的屬性。所有頁面都需要認證,因此任何不是的人都被重定向到完美無瑕的登錄視圖。因此,一個簡單的嘗試利用用戶的視圖中的屬性是這樣的:

<%= Model.UserName %> 

我將擺在一個視圖中,並在該網站的主視圖。

當用戶已經通過身份驗證時,所有工作都應該如此,用戶名將在頁面上打印兩次。但是,當身份驗證票證過期或新用戶出現時,該頁面將不會重定向到登錄名,而是會生成一個異常,它會在主視圖中投訴來自<%= Model.UserName%>的空引用。

當我從主視圖中刪除<%= Model.UserName%>並將其保留在普通視圖中時,它將按照原樣重定向,而不會引發錯誤。

我希望這個更清楚些。

編輯:

也許有人可以提供一個更好的方式來訪問身份驗證的用戶的母版頁的信息?

編輯#2:

我會看到的已認證用戶的信息在母版頁被訪問的任何例子......這纔是真正的頭象棋對我很感興趣。

更新:

我還沒有接受的答案,因爲我很熟悉,我怎麼能測試用戶是否被認證。我很想知道爲什麼沒有重定向到登錄頁面。

回答

1

我設法重現此錯誤的唯一方法是,如果我違規代碼塊添加到從不需要身份驗證,然後看at'em無需登錄頁面引用的母版。

如果您的主頁面未在登錄頁面上使用,則可能表明其他內容不完全適用。您的路由和身份驗證如何設置?如果您的視圖在重定向之前得到實例化,您的主頁面也會引發這種行爲。

+0

我在基礎控制器上有一個[Authorize]屬性,所有其他控制器都從其繼承,並且我相信我的路由是健全的。 「其他的東西還沒有完全到位,」當時,我仍然懷疑是原因 - 我找不到它。謝謝。 – asfsadf 2010-09-22 17:00:53

+1

在違規的主頁面中,添加行<%= this.ViewContext%>,然後右鍵單擊和「斷點」 - >「插入斷點」。然後檢查ViewContext,應該給你指針哪些視圖已被加載等 – 2010-09-23 06:50:19

+0

我無法想出這救了我的生活,但我打算把它標記爲「答案」,並繼續前進。謝謝您的幫助。 – asfsadf 2010-09-24 05:31:19

2

這不是因爲母版頁。

Membership.GetUser()將返回當前登錄的成員資格用戶。如果沒有用戶登錄,它將返回null,這就是導致你的問題。

在使用任何用戶信息之前,您可以在主頁面中使用if語句來檢查用戶是否已登錄。

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

謝謝。事情是,通常如果用戶還沒有通過身份驗證,他將被重定向到登錄頁面,而這只是拋出一個異常,並沒有打擾重定向。 – asfsadf 2010-09-12 06:09:23

+0

如果您在未經身份驗證的用戶有權訪問的其他頁面中使用您的母版頁(例如登錄頁面),那麼您需要檢查。 – 2010-09-12 06:25:45

+0

如果您認爲在您的視圖中檢查用戶信息會使事情複雜化,那麼您可以創建一個助手來讓您的生活更輕鬆。另一個解決方案是有兩個主頁面。一個用於由包含用戶信息的經認證的用戶訪問的頁面。另一個用於未經身份驗證的用戶有權訪問的頁面不包含用戶信息。 – 2010-09-12 06:29:17

0

不知道這是否仍然適用於mvc2,但您是否嘗試過在web.config中定義loginUrl屬性?

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

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

我有,但無論如何,謝謝你。 – asfsadf 2010-09-21 04:45:43