验证成功后如何获取用户信息?

时间:2013-08-15 17:50:20

标签: c# asp.net-mvc-4

目标

成功验证后获取用户信息。

问题

查看以下代码片段:

[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
[AllowAnonymous]
public ActionResult Authenticate(User userModel)
{
    if (ModelState.IsValid)
    {
        if (userModel.IsValid(userModel.Email, userModel.Password))
        {
            FormsAuthentication
                .SetAuthCookie(userModel.Email, userModel.Remember);
            return RedirectToAction("Index", "Manager");
        }
        else
        {
            ModelState.AddModelError("", "Login data is incorrect!");
        }
    }
    return RedirectToAction("Index");
}

如您所见,它是普通身份验证的控制器。我需要的是简单:如果语句userModel.IsValid为真,我如何根据userModel.Email发送给服务器的电子邮件获取用户信息?

也许将电子邮件存储在会话中并在Index方法中调用一些方法来获取(用户)信息通过参数传递会话中的电子邮件? (我认为这不是最好的方法,因为如果cookie存在且会话不存在,那么这里会出现问题。)

代码聚光灯

要获取某些用户的信息,我使用的是一种简单的方法:User.Invoke((string) userEmail)

知识改进

我正在使用emailpassword登录我的网站,因为世界各种应用程序都在这里。使用用户输入的email,我试图从数据库中获取他的信息。所以我问:这是最好的方法吗?也许不是更好首先通过他的电子邮件获取用户的ID,然后选择他的信息?

我已经尝试了什么

Authenticate方法(与之前通过的方法相同)中,我实现了以下代码:

[...]
public ActionResult Authenticate(User userModel)
    [...]
    if (userModel.IsValid(userModel, userModel.Password))
    {
        FormsAuthentication
            .SetAuthCookie(userModel.Email, userModel.Remember);

        Session["UserEmail"] = userModel.Email; // <-- Pay attention to this

        return RedirectToAction("Index", "Manager");
    }
    [...]
}

然后,在Index方法中:

public ActionResult Index()
{
    if(Request.IsAuthenticated())
    {
        UserProfile user = User.Invoke(Session["UserEmail"]));
        return View(user);
    }
    else
    {
        return View();
    }
}

但正如我所说,如果标记用户登录的cookie是活动的而会话没有,那么这里就会出现问题 - 一种概念冲突(cookie vs.会话)。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

接受的答案(来自与OP的讨论)是:检索表单身份验证模块设置的用户名的最直接方法是使用

HttpContext.Current.User.Identity.Name

或只是

this.User.Identity.Name

在控制器中。