在何处以及如何“缓存”ASP.NET角色数据
设计选择
假定两个ASP.NET MVC授权/角色设计故事.两者都旨在最大限度地减少针对中间层或数据存储的命中: >从数据库中获取“MyRoleProvider”信息后,它随后存储在AuthTicket用户数据中,这反过来意味着auth-cookie包含role-info.此外,在本文中,存储和检索此角色信息是通过完全在“MyRoleProvider”之外的独特实现来完成的. 要么… >从数据库中获取“MyRoleProvider”信息后,随后将其存储在会话中并从那里进行访问.更确切地说,类“MyRoleProvider”本身将在可能的情况下在内部访问(和更新)会话. 同样,上述两个故事都旨在通过“缓存”角色信息来最小化击中外部商店的延迟.两者都很好.问题是,两个设计故事选择同样有效吗?如果没有,为什么? 问题 在任何地方似乎都没有“最佳实践”,其中说“你的(自定义)RoleProvider应该始终知道在哪里找到角色信息,无论是在会话,缓存,数据库等等.” 此外,似乎没有任何(可靠)指导可以解释您不应该在authCookie中的“userData”中存储哪些类型的内容.那里的文档和指导只有两点: >’userData’可以存储其他用户信息(模糊,广泛的声明).我在网上只看到一个代码示例,其中涉及存储其他第三方身份/身份验证信息. 而已.从上面的指导中,没有人被明确告知“将userData仅限于身份验证信息是最佳做法.”我当然没有看到一个文档说“将授权或角色信息放入’userData’是个坏主意,因为…” 推出最佳实践? 关于两个设计选择相同的我自己的答案是“不”.我想提出我的论点,并在以下情况下向你学习: >你同意. 希望最佳实践概念能够作为答案出现.现在我的论点…… 我的论点 我认为应该采用第二个设计故事,因为它代表了更好的模块化:角色信息完全在“MyRoleProvider”中处理.第一个选项不必要地混合认证(从cookie中提取标识)和授权问题.实际上,所有内置的ASP.NET安全机制都将这两个主题分开;基本ASP.NET功能永远不会在authcookie中存储role-info.如果有人想要确认这一点,请尝试反映这些类:FormsAuthenticationModule,FormsAuthentication,带有RolePrincipal实现的IPrincipal,以及带有FormsIdentity实现的IIdentity. ASP.NET RolePrincipal值得一个特别的亮点.它允许role-info确实存储在cookie中,但它是与auth-cookie分开的第二个cookie.此外,这种特殊的习语仍然涉及与RoleProvider的协商.见example section of this MSDN documentation. 进一步调查RolePrincipal,让我们看一下RolePrincipal.IsInRole().虽然任何此类IPrincipal派生类以编程方式组合身份和角色信息,但内部实现仍将RoleProvider维护为角色信息的唯一来源(请注意对Roles.RoleProviders的引用…): public bool IsInRole(string role) { if (this._Identity != null) { if (!this._Identity.IsAuthenticated || role == null) { return false; } else { role = role.Trim(); if (!this.IsRoleListCached) { this._Roles.Clear(); string[] rolesForUser = Roles.Providers[this._ProviderName].GetRolesForUser(this.Identity.Name); string[] strArrays = rolesForUser; for (int i = 0; i < (int)strArrays.Length; i++) { string str = strArrays[i]; if (this._Roles[str] == null) { this._Roles.Add(str,string.Empty); } } this._IsRoleListCached = true; this._CachedListChanged = true; } return this._Roles[role] != null; } } else { throw new ProviderException(SR.GetString("Role_Principal_not_fully_constructed")); } } 这种ASP.NET“一站式”深度假设角色信息的位置,这就是为什么角色信息应该整合到RoleProvider中.总之,我声称: >如果你将角色信息存储在cookie中,那么ASP.NET没有内置功能将其组合到auth-cookie中的原因正是因为ASP.NET强烈地保持了不同提供者之间关注点的分离. . 结论: 不要将role-info放入auth-cookie中,并确保您的(自定义)RoleProvider知道找到角色信息的所有位置,无论是数据库,Web服务,会话,缓存还是cookie. 同意?不同意?思考? 解决方法
在我看来,你问的是一个荒谬的问题.没有人会将角色数据存储在身份验证cookie中. ASP.NET并不是这样做的,因为它们提供了将它存储在加密的单独cookie中的RolePrincipal.
无论如何,整个cookie问题都是毫无意义的,因为这是RolePrincipal的一个实现细节.应用程序不应该知道角色数据的存储位置. 所以我的问题是……为什么我们甚至讨论这个问题?你问最好的做法是做一些违背系统完成的事情,然后争论为什么你不应该这样做,没有人会用. 此外,您对RoleProvider必须处理cookie的评论不正确. RoleProvider不会创建RolePrincipal,这是在框架内完成的.是否使用cookie的选择不在RoleProvider中,而是由RoleManagerModule框架类提供,以及框架实例化IPrincipals的方式. RolePrincipal中的示例与RoleProvider无关.实际上,RoleManagerModule控制着这个功能. RoleManagerModule是一个HttpModule,它安装在IIS中并作为管道的一部分运行.它甚至不知道RoleProvider,基本上这意味着角色是从cookie中以非常低的级别填充的,当`RoleProvider开始运行时,如果它找到已存在的角色,它就是没有. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 无法加载文件或程序集’Microsoft.Office.Inter
- ASP.NET命名空间
- asp.net-mvc-routing – @ Url.Action获取?附加长度= 2
- asp.net – 如何从Javascript调用控制器方法
- asp.net – 在Visual Studio 2010 SP1中使用IIS Express时出
- asp.net-mvc – 添加为视图的链接intellisense
- ASP.NET安全最佳实践
- asp.net – 用户定义的CSS /样式
- asp.net-web-api – 从响应中删除标题
- asp.net-mvc-3 – MV3复选框的重复查询字符串值(true,false
- asp.net-mvc – 在ASP.NET MVC 3中用逻辑构建子视
- asp.net – 防止百分比字符转换
- asp.net – Response.Flush()仅适用于Firefox
- .NetCore技术研究-.NET Core迁移前的准备工作
- asp.net – Windows 8 RTM上的Visual Studio 201
- asp.net-mvc – 在ASP.NET MVC中的Controller内生
- asp.net-mvc – 在AccountController之外访问Use
- asp.net-mvc-3 – ASP.NET MVC 3 MSChart错误:此
- DELETE语句与ASP.NET动态数据中的REFERENCE约束冲
- asp.net – 如何动态显示网站上的SVN修订版?