【问题标题】:ASP.NET MVC: User.Identity.Name not available even when page is authenticatedASP.NET MVC:即使页面经过身份验证,User.Identity.Name 也不可用
【发布时间】:2012-03-03 21:08:32
【问题描述】:

我最近收到了一些错误报告,这些报告似乎表明有时 User.Identity.Name 是 NULL 或与应有的不同(经过身份验证的用户的用户名),即使页面经过身份验证也是如此:

[Authorize]
[HttpGet]
public ActionResult MyAction() 
{
    string username = User.Identity.Name;
    Member member = memberRepository.GetMemberByUserName(username); 

    member.something // fails with a null reference exception
}

GetMemberByUserName() 方法使用 Linq to SQL 检索成员。

public Member GetMemberByUsername(string username)
{
    if (String.IsNullOrEmpty(username))
        return null;

    return db.Members.SingleOrDefault(d => d.username.Equals(username));
}

在什么情况下会发生这种情况?每次使用时都需要检查 User.Identity.Name 是否为NULL

当然,User.Identity.Name 可能是一个红鲱鱼,也可能是数据库没有返回任何内容。不过,如果是这种情况,我可能会预料到会引发异常。

编辑: 这是一个间歇性问题 - 可能是经过身份验证的用户刷新一次,User.Identity.Name 是正确的并检索到成员,然后在第二次刷新时,未检索到成员。

【问题讨论】:

  • 这里唯一可能的返回情况是返回 null 或空成员。
  • 检查 User.Identity.Name 返回的内容以及数据库中是否存在此类值。希望能给你提示。
  • 肯定在数据库里。此代码间歇性出错。

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


【解决方案1】:

可能是数据库没有返回任何内容。不过,如果是这种情况,我可能会预料到会引发异常。

不,不会。 SingleOrDefault 将返回一条记录、无记录,或如果存在多条记录则抛出异常

Single 将返回一条记录,或者如果没有记录或存在多条记录则抛出异常

可能是一些事情。也许您对String.Equals 有区分大小写的问题。

Request.IsAuthenticated[Authorize] 所看到的)仍有可能是真的,但没有身份。在自定义身份验证系统中尤其如此(例如尝试解密表单身份验证票证),并且您尚未指定使用什么。

此外,确保Username 字段由唯一索引 支持,以提供服务器端保证SingleOrDefault 永远不会引发异常。

我会在你的控制器动作中加入一些 try/catch,并设置 ELMAH 来捕捉异常。

【讨论】:

  • 我不相信 User.Identity.Name 不返回任何东西真的是一个问题。通常,这会引发异常,因为 Identity 将为空,从而使 Name 属性不可访问。所以我会按照 RPM1984 的建议专注于 db 的东西。
  • @Jeff - 也许“姓名”为空。我们不知道,我们只能根据给出的信息进行推测。
  • 我认为它会抛出异常,因为用户确实存在于数据库中 - 这是发生的间歇性错误。
【解决方案2】:

怎么样:

public Member GetMemberByUsername(string username)
{
    if (String.IsNullOrEmpty(username))
       return null;

    return db.Members.SingleOrDefault(d => d.username.Equals(username));
}

【讨论】:

  • 糟糕,抱歉 - 我的问题打错了。这实际上就是方法所说的。答案已编辑。
猜你喜欢
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 2015-03-12
  • 2013-11-25
相关资源
最近更新 更多