ASP.NET MVC:即使页面经过身份验证,User.Identity.Name也不可用

时间:2012-03-03 21:08:32

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

我最近收到的一些错误报告似乎表明,有时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是正确的并且检索到成员,然后在第二次刷新时,不会检索该成员。

2 个答案:

答案 0 :(得分:2)

怎么样:

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

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

答案 1 :(得分:2)

  

可能是数据库没有返回任何内容。如果是这样的话,我可能会预料会抛出异常。

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

Single将返回单个记录,或如果没有记录或多个记录则抛出异常

可能是一些事情。也许您对String.Equals感到区分大小写。

Request.IsAuthenticated[Authorize]所看到的)仍然可能是真的,但没有身份。特别适用于自定义身份验证系统(例如尝试解密表单身份验证票证),而您尚未指定使用的内容。

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

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