ASP.NET MVC2主页面和身份验证

时间:2010-09-12 03:49:43

标签: asp.net asp.net-mvc asp.net-mvc-2

更新:我无法删除这个问题,因为答案已经被提出,但它根本不是我所要求的答案。我想删除这个,因为它已经过了一个星期没有回答,它只是拖累我的接受%。感谢。

我有一个强类型的母版页,其中包含基于当前经过身份验证的用户的UserId的信息:

(Guid)Membership.GetUser().ProviderUserKey

其他所有正常操作/视图都要求用户在查看之前进行身份验证,这意味着用户的信息可以保证可用。

问题是,当我尝试访问用户的信息时,我只获得空引用异常。来自该网站的母版页。我猜这是因为没有适用于母版页的[Authorize]属性。

我有这个错吗?还有其他可能的原因吗?

简单示例:

我网站的各个页面都使用继承主页面视图模型的视图模型对象:

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

经过身份验证的用户对象是此基本视图模型的属性。所有页面都需要身份验证,因此任何不需要身份验证的人都会被重定向到登录视图,登录视图一直运行良好。因此,在视图中使用用户属性的简单尝试是:

<%= Model.UserName %>

我将把它放在其中一个视图中,以及网站的主视图中。

当用户已经过身份验证时,一切正常,UserName在页面上打印两次。当auth票证过期或者新用户出现时,页面将不会重定向到登录,而是生成一个异常,该异常会抱怨来自&lt;%= Model.UserName%&gt;的空引用。在主视图中。

当我删除&lt;%= Model.UserName%&gt;从主视图中,将其保留在普通视图中,它会按原样重定向,而不会抛出错误。

我希望这更清楚一点。

编辑:

也许有人可以提供更好的方法来访问母版页中经过身份验证的用户信息?

编辑#2:

我非常有兴趣看到在母版页中访问经过身份验证的用户信息的任何示例...这对我来说真是令人头疼。

更新

我没有接受答案,因为我非常熟悉如何测试用户是否经过身份验证。我很想知道为什么没有重定向到登录页面。

3 个答案:

答案 0 :(得分:2)

这不是因为母版页。

Membership.GetUser()将返回当前登录的成员资格用户。如果没有用户登录,它将返回null,这就是造成问题的原因。

在使用任何用户的信息之前,您可以在母版页中使用if语句来检查用户是否已登录。

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

答案 1 :(得分:1)

我设法重现此错误的唯一方法是,如果我将违规代码块添加到从不需要身份验证的页面引用的母版页中,那么请在不登录的情况下查看.em。

如果您的母版页未在您的登录页面上使用,则可能表明其他内容未完全到位。您的路由和身份验证设置如何?如果您的View在重定向之前被实例化,那么您的母版页也会引发此行为。

答案 2 :(得分:0)

不确定这是否仍适用于mvc2,但您是否尝试在web.config中定义loginUrl属性?

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

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