我知道之前提出过类似的问题,但我找不到专门处理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值。
你怎么做?我想知道我的设置是否有问题,如果是,那有什么不对?我对我的解决方案并不是很满意,主要是因为我对周期不太熟悉,而且我不确定我是否将代码放在正确的位置。
我知道这里可能没有“一个答案将所有人联系在一起”,我接受了提供最多洞察力的答案。
答案 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>" %>