【问题标题】:ASP.NET MVC2 master page and authenticationASP.NET MVC2 母版页和身份验证
【发布时间】:2010-09-12 03:49:43
【问题描述】:

更新:我无法删除这个问题,因为答案已被投票,但它根本不是我所问问题的答案。我想删除这个,因为已经有一周没有答案了,它只是拖累了我的接受百分比。谢谢。

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

(Guid)Membership.GetUser().ProviderUserKey

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

问题是,当我尝试访问用户信息时,我只会得到空引用异常。从网站的母版页。我猜这是因为没有适用于母版页的 [Authorize] 属性之类的东西。

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

简单示例:

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

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

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

<%= Model.UserName %>

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

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

当我从主视图中删除 并将其保留在普通视图中时,它会按应有的方式重定向,而不会引发错误。

我希望这更清楚一些。

编辑:

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

编辑#2:

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

更新:

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

【问题讨论】:

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


    【解决方案1】:

    这不是因为母版页。

    Membership.GetUser() 将返回当前登录的会员用户。如果没有用户登录,它将返回 null,这就是导致您的问题的原因。

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

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

    【讨论】:

    • 谢谢。问题是,通常如果用户尚未通过身份验证,他将被重定向到登录页面,而这只会引发异常并且不会打扰重定向。
    • 如果您在未经身份验证的用户可以访问的其他页面(例如登录页面)中使用您的母版页,那么您需要检查。
    • 如果您认为在您的视图中检查用户信息会使事情变得复杂,那么您可以创建一个 Helper 来让您的生活更轻松。另一个解决方案是拥有两个母版页。一个用于经过身份验证的用户访问的页面,其中包含用户信息。另一个用于未经身份验证的用户可以访问但不包含用户信息的页面。
    • 就是这样——一切都需要身份验证。一切都按预期重定向,直到我尝试访问用户信息。在母版页中,此时它生成了一个异常,而不是首先重定向到登录页面。
    • 好像母版页是唯一无法重定向未经身份验证的用户的页面,而是首先查找用户的属性,当他们甚至没有登录时这些属性当然是空的。
    【解决方案2】:

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

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

    【讨论】:

    • 我在所有其他控制器继承的基本控制器上有一个 [Authorize] 属性,我相信我的路由是正确的。 “其他东西不完全到位,”过去是,现在仍然是我怀疑的原因——我只是找不到。谢谢。
    • 在有问题的母版页中,添加行 ,然后右键单击并“断点”->“插入断点”。然后检查 ViewContext,应该会给你哪些 View 已经加载等的指针
    • 我想不出这个来挽救我的生命,但我会将此标记为“答案”,然后继续前进。感谢您的帮助。
    【解决方案3】:

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

    <authentication mode="Forms"> 
     <forms loginUrl="/user/login" />
    </authentication>
    
    <authorization>
     <deny users="?" />
    </authorization>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2011-08-17
      • 1970-01-01
      相关资源
      最近更新 更多