设置/获取用户是否已登录信息的最佳做法

时间:2010-01-06 09:09:41

标签: asp.net-mvc login controller

我知道之前提出过类似的问题,但我找不到专门处理ASP.NET MVC(和控制器方面)的副本。

我的问题如下:

在MVC模型中,我的理解是控制器应该处理使用HttpContext来确定谁登录,如果有的话。这样控制器就可以将这些信息呈现给视图,这样视图本身就不必执行这些查找。

有没有关于如何做的事实标准?

我目前的设置如下[简化]

我有一个BaseController,我的所有其他控制器都继承了这个。

BaseController中,我执行以下覆盖:

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
     base.Initialize(requestContext);
     ViewData["IsUserLoggedIn"] = IsUserLoggedIn; // bool property checking HttpContext.User.Identity.IsAuthenticated;
     ViewData["CurrentUser"] = CurrentUser; // Property returning logged in user, or null.

}

然后,在我的视图中,我自然可以检查ViewData值。

怎么做?我想知道我的设置是否有问题,如果是,那有什么不对?我对我的解决方案并不是很满意,主要是因为我对周期不太熟悉,而且我不确定我是否将代码放在正确的位置。

我知道这里可能没有“一个答案将所有人联系在一起”,我接受了提供最多洞察力的答案。

2 个答案:

答案 0 :(得分:2)

我通常会将加密元素放入cookie中。该元素可以是任何东西,但我通常将其作为用户名。

然后在Global.asax.cs中实现Application_AuthenticateRequest。每次加载页面时,系统都会调用此方法。在那个方法中我检查cookie,如果它存在,我尝试加载用户。如果用户成功加载,那么我知道我有一个登录用户,并且我将当前Threads当前Principal属性设置为该用户。

在当前线程上设置CurrentPrincipal后,您可以从Controller,View,业务层,执行路径中的任何位置访问该用户。

如果由于某种原因我不能使用cookie,那么我将在ViewData中传递它(再次加密以防万一),并将其存储在隐藏变量中。然后当Controller :: OnActionExecuting运行时,我通常在AuthenticateRequest中执行相同的工作(即加载用户并将其放在线程上)。

答案 1 :(得分:0)

我有一个所有控制器继承的BaseController类。它具有存储在会话中的“CurrentUser”属性。我的控制器的完整代码有一些用于检索用户的逻辑,但这是基本的想法。

public class BaseController : Controller
{

User _currentUser = null;
public User CurrentUser
{
    get
    {
        if (_currentUser == null)
            _currentUser = (User)HttpContext.Session["CurrentUser"];

        return _currentUser;

    }
    set
    {
        _currentUser = value;
        HttpContext.Session["CurrentUser"] = value;
        }
    }
}


}

我的模型都继承自BaseModel类,该类也具有CurrentUser属性。

public class BaseModel
{
    public User CurrentUser { get; set; }
}

public class HomeIndexData : BaseModel
{

}

然后我的控制器将用户传递给模型,这允许我拥有强类型视图。

[HttpGet]
public ActionResult Index()
{
    HomeIndexData data = new HomeIndexData();
    data.CurrentUser = this.CurrentUser;

    return View(data);
}

使用这种技术,我还可以使用BaseModel拥有一个强类型的母版页。

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