我希望能够在整个应用程序中全局访问(Controllers,HtmlHelpers和其他帮助程序类)中的登录用户,而不会获得User为null并且能够处理guest虚拟机的异常(未登录)用户)。
这应该在我的UsersRepository中处理吗?如果是这样,怎么样?还是有更好的方法?
答案 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);
}
}