2010-09-12 61 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