gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 中的自定义主体

转载 作者:行者123 更新时间:2023-12-03 06:17:48 25 4
gpt4 key购买 nike

我希望能够访问经过身份验证的用户的自定义属性(例如 UserId 和 FirstName),而无需每次都查询数据库。我发现this site通过 Stack Overflow 上的一篇文章,我喜欢这种方法 - 但我使用 IoC/存储库,并决定不尝试让 global.asax 与数据库通信,因为担心它与存储库模式不兼容。

相反,我创建了一个 CustomPrincipal 接口(interface),并使用 IoC (CaSTLe) 创建一个实例并将其传递给 Controller ​​(随后传递给我的基本 Controller )。

基本 Controller 使用我在 CustomPrincipal 中创建的方法来实现博客作者在 global.asax 中解决的相同任务。即,CustomPrincipal 从数据库或缓存中初始化并分配给 HttpContext.Current.User。

然后我的 Controller / View 可以引用属性,如下所示...

((ICustomPrincipal)(HttpContext.Current.User)).FirstName;

它有效,但我感觉到一些代码味道。首先也是最重要的,如果我从 Controller 引用 HttpContext,我就终止了单元测试。我正在考虑修改我的 CustomPrincipal 对象以返回上述值(以便我可以在单元测试中模拟它),但我想知道这是否是一种解决方法而不是一个好的解决方案。

我的处理方式正确吗?我可以做一些小的调整来使其成为一个强大的解决方案,还是应该从头开始使用 FormsAuthenticationTicket 或类似的东西?

谢谢!

最佳答案

我想提出一个替代想法,以便寻找此信息的人可以有一些选择。

我去寻找一个可行的 FormsAuthenticationTicket 示例,发现 NerdDinner在不影响单元测试的情况下添加自定义属性做得相当不错。

就我而言,我修改了 LogOn 例程(我已经在单元测试中模拟了该例程)以创建 FormsAuthenticationTicket。 NerdDinner 加密票证并将其添加为 cookie,但我也可以将加密票证添加到缓存,如 original proposal 。我还用表示所有自定义属性的 JSON 序列化对象替换了单个 UserData 属性。

CustomIdentityDTO dto = new CustomIdentityDTO { 
UserId = userId, FirstName = firstName, LastName = lastName };
JavaScriptSerializer serializer = new JavaScriptSerializer();

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1, // version
username,
DateTime.Now, // creation
DateTime.Now.AddMinutes(30), // expiration
false, // not persistent
serializer.Serialize(dto));

string encTicket = FormsAuthentication.Encrypt(authTicket);
//HttpContext.Current.Response.Cookies.Add(...)
HttpContext.Current.Cache.Add(username, encTicket, ...

然后,我通过 PostAuthenticateRequest 处理程序在 global.asax 中检索加密票证(从缓存或 cookie),就像 NerdDinner(对于 cookie)或博主的提案(对于缓存)一样。

NerdDinner 实现 IIdentity 而不是 IPrincipal。代码中自定义字段的引用如下:

((CustomIdentity)Page.User.Identity).FirstName // from partial view

((CustomIdentity)User.Identity).FirstName // from controller

使用这两种方法后,我发现 NerdDinner 的方法效果非常好。切换后我并没有遇到太多障碍。

关于asp.net-mvc - ASP.NET MVC 中的自定义主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3763221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com