全局访问登录用户的好方法

时间:2011-07-15 13:58:40

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

我希望能够在整个应用程序中全局访问(Controllers,HtmlHelpers和其他帮助程序类)中的登录用户,而不会获得User为null并且能够处理guest虚拟机的异常(未登录)用户)。

这应该在我的UsersRepository中处理吗?如果是这样,怎么样?还是有更好的方法?

2 个答案:

答案 0 :(得分:1)

您可以创建自定义标识和主体类。您的自定义标识类可以扩展您当前使用的任何内容,然后只需添加您需要的额外信息。

然后在全局操作过滤器中,只需使用自定义主体覆盖当前主体。然后,您可以像普通身份一样从任何地方访问它,但如果您需要其他信息,只需将其转换为自定义身份类。这将授予您访问其他信息的权限。

答案 1 :(得分:0)

您可以编写在每个请求上执行的自定义操作过滤器(将其注册为全局过滤器)。此过滤器将加载用户(例如,从用户的存储库)并将其置于http上下文中,例如或在ViewData中。

修改

好的,过滤器的代码看起来像这样(在这种情况下,它将用户加载到ViewData集合)。我没有在这里考虑匿名用户。

public class LoadUserToViewDataAttribute : ActionFilterAttribute
{
    private IUserRepository _userRepository;

    public LoadUserToViewDataAttribute(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var controller = filterContext.Controller;
        var userName = filterContext.HttpContext.User.Identity.Name;
        var user = _repository.GetUser(userName);

        controller.ViewData.Add("CurrentUser", user);
    }
}