我希望能够访问经过身份验证的用户(如 UserId 和 FirstName)的自定义属性,而无需每次都查询数据库。我通过 Stack Overflow 上的一篇文章找到了这个站点,我喜欢这种方法 - 但我使用 IoC / 存储库并决定不尝试让 global.asax 与数据库通信,因为担心它与存储库模式不兼容。
相反,我创建了一个到 CustomPrincipal 的接口,并使用 IoC (Castle) 创建一个实例并将其传递给控制器(随后传递给我的基本控制器)。
基本控制器使用我在 CustomPrincipal 中创建的方法来完成博客作者在 global.asax 中提出的相同任务。即,CustomPrincipal 从数据库或缓存中初始化并分配给 HttpContext.Current.User。
然后我的控制器/视图可以引用如下属性...
((ICustomPrincipal)(HttpContext.Current.User)).FirstName;
它有效,但我感觉到一些代码气味。首先也是最重要的,如果我从控制器中引用 HttpContext 我已经杀死了我的单元测试。我正在考虑修改我的 CustomPrincipal 对象以返回上述值(这样我就可以在我的单元测试中模拟它),但我想知道这是否是一种解决方法而不是一个好的解决方案。
我会以正确的方式解决这个问题吗?我可以做一些小的调整来使它成为一个强大的解决方案,还是我应该从头开始使用 FormsAuthenticationTicket 或类似的东西?
谢谢!