【问题标题】:Membership.GetUser() is returning null when app starts应用程序启动时,Membership.GetUser() 返回 null
【发布时间】:2012-09-16 12:32:14
【问题描述】:

我已经实现了我自己的AccountProfile 类是 ASP.net MVC,它可以工作,但现在我遇到了一个奇怪的问题。首先,我在 Views/Shared/_LoginPartial.cshtml 中调用 AccountProfile.MyProperty。 AccountProfile.MyProperty 调用 Membership.GetUser().UserName 来工作。现在,当我“注册”一个帐户时,在我登录后,AccountProfile.MyProperty 工作并将信息呈现到 html 页面中。

但是,当我停止运行、更改一些代码并再次启动时,Membership.GetUser() 返回 null,即使我仍然根据成员身份登录。

页面加载失败后,如果我导航到 /Account/Login 页面,Membership.GetUser() 可以工作。工作后,我可以导航到开始时不起作用的索引页面,并且它可以工作。

我的问题是为什么当我的页面首次加载时 Membership.GetUser() 返回 null?

谢谢。

【问题讨论】:

  • 听起来你是在验证开始之前请求 Membership.GetUser()。
  • 我该如何解决这个问题?如果我从或转到帐户/登录页面,GetUser 从那里开始工作(我什至不登录)。但是,如果我尝试从另一个页面开始,它就不起作用:(
  • 当 Membership.GetUser() 返回 null 时,User.Identity.IsAuthenticated 也返回 true。

标签: c# asp.net asp.net-mvc asp.net-membership membership-provider


【解决方案1】:

试试这个

using Microsoft.AspNet.Identity;

var id = User.Identity.GetUserId();

【讨论】:

    【解决方案2】:

    将 [InitializeSimpleMembership] 添加到控制器

    例子:

    using System.Linq;
    using System.Web.Mvc;
    using System.Web.Security;
    using Bencsharp.BL.Services;
    using Bencsharp.Mvc.Filters;
    using Bencsharp.Mvc.Models;
    
    namespace Bencsharp.Mvc.Controllers
    {
        [InitializeSimpleMembership]
        public class HomeController : Controller
        {
            // ...
        }
    }
    

    【讨论】:

      【解决方案3】:

      刚刚遇到同样的问题。 在 MVC 4 中,使用过滤器 InitializeSimpleMembershipAttribute 初始化默认身份验证系统(从生成的项目的源代码中非常清楚)。并且过滤器仅应用于AccountController(因此,一旦您访问登录或此控制器的任何其他页面,身份验证系统就会初始化,您可以在任何需要的地方正常使用Membership.GetUser()

      对于我当前的项目,快速而肮脏的解决方案是拥有一些控制器,定义如下:

      [InitializeSimpleMembership]
      public abstract class DefaultController : Controller
      {}
      

      并从DefaultController 派生我的应用程序的其他控制器,而不是直接从 Controller 派生。 此外,这种技术非常适合在一个地方拥有常用属性(如 dbcontext 变量等)。

      【讨论】:

        【解决方案4】:

        请看下面的帖子,也许你有同样的问题? :

        希望对你有帮助

        【讨论】:

        • 没有解决问题:(
        • 尝试另一个链接。这可能有1001个原因,只需一个一个尝试,希望您属于主流问题类别:)尝试,请告诉我它是否适合您以及文章是否有帮助。
        【解决方案5】:

        好的,我找到了一个解决有问题的 Membership.GetUser() 函数的工作。

        HttpContext.Current.User.Identity.Name
        

        这段代码获取了登录的用户名,它实际上似乎可以工作。如果我有任何问题,我会在这里报告。

        【讨论】:

        • 真的吗?为什么有人会“否决”我的问题的解决方案?当用户登录并通过身份验证时,Membership.GetUser() 显然返回 null。此外,它仅在用户第一次尝试加载主页时返回 null,而不是在他们尝试加载 /Account/Login 页面时返回。在他们加载 /Account/Login 页面后,他们可以正常加载主页。 HttpContext.Current.User.Identity.Name 有效,而 Membership.GetUser() 在用户已经登录并通过身份验证时无效。这是在 MVC 4 .NET v4.5 上。
        • 它被否决了,因为它不是一个解决方案。您的代码中还有其他问题导致了这种行为。您的解决方案是一种解决方法,而不是修复方法。
        猜你喜欢
        • 1970-01-01
        • 2011-11-01
        • 2020-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        相关资源
        最近更新 更多