在何处以及如何"cache" ASP.NET 角色数据



设计选择

假定两个ASP.NET MVC授权/角色设计故事。两者都旨在最大程度地减少对中层或数据存储的命中:

  • 从数据库中获取了"肉豆蔻虫"信息后,随后将其存储在AuthTicketicket用户数据库中,这又意味着Auth-Cookie持有角色信息输入。此外,在这个故事中,存储和检索这种角色侵入是通过独特的实现来完成的,完全是在外面的" Myroleprovider"。"

或...

  • 从数据库中获取"肉豆蔻培训"信息后,随后将其存储在会话中并从那里访问。更准确地说,"肉豆蔻培训者"本身将在可能的情况下内部访问(和更新)会话。

再次,以上两个故事旨在最大程度地减少" caching"击中外部商店的潜伏期。角色信息。两者都很好。问题是,两个设计故事的选择是否同样有效?如果不是,为什么?

问题

似乎没有"最佳实践"在任何地方说明"您的(自定义)Roleprovider都应始终知道找到角色侵入的位置,无论是在会话,缓存,数据库等中。

此外,任何地方似乎都没有(固体)指导,可以解释您不应该存储在"用户达塔"中的哪些东西。在Authcookie中。只有很少的文档和指导只暗示了两件事:

  1. " UserData"可以存储其他用户信息(模糊,广泛的语句)。我仅在线看到一个代码示例,其中涉及存储额外的第三方身份/身份验证信息。
  2. 不要在" UserData"中放置太多数据,因为它可能会使cookie变得太大而无法转移(有些浏览器限制了cookie尺寸)。

就是这样。从上述指南中,没有人明确地告诉"只限制userdata仅以身份验证信息"是一种最佳实践。我当然还没有看到一份文档,说"将授权或角色info放入"用户达塔"是一个坏主意,因为...

推断出最佳练习?

我对两个设计选择相同的答案是"否"。我想提出我的论点,并向您学习:

  1. 您同意。
  2. 您不同意,因为我要大惊小怪。
  3. 你不同意;尽管我的论点是有效的,但甚至有更好的论点,为什么我的思想最终不正确。

希望将出现一个最佳实践概念作为答案。现在我的论点...

我的参数

我相信应该采取第二个设计故事,因为它代表了更好的模块化:角色信息在" Myroleprovider"内部完全处理。第一个选项不必要地将身份验证(从cookie中提取识别)和授权问题。实际上,所有内置的ASP.NET安全机制都将这两个主题分开。基本ASP.NET功能永远不会在AuthCookie中存储角色INFO。如果有人想确认这一点,请尝试反映这些类别:formauthenticationmodule,formauthentication,iprincipal具有roleprincipal insparinaion,以及具有Formsidentity实施的Indentity。

ASP.NET Roleprincipal值得特别的亮点。它允许角色info确实存储在cookie中,但它是第二个cookie 与auth-cookie 分开的。此外,这个奇特的成语仍然涉及与罗勒普里德(Roleprovider)的磋商。请参阅此MSDN文档的示例部分。

进一步研究罗洛顾问,让我们看一下roleprincipal.isinrole()。尽管以编程方式结合了身份和角色信息,但内部实现仍然将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中的原因。简而言之,我声称:

  1. 如果您 do 在cookie中存储角色信息,那么ASP.NET没有内置能力将其组合到auth-cookie中的原因,正是因为ASP.NET维护
  2. 之间的关注点分开
  3. 任何Roleprovider都应意识到可以在cookie,session或其他方式中找到角色侵入的位置。

结论:

请勿将角色侵入式投入到auth-cookie中,并确保您(自定义)Roleprovider 知道找到角色信息的所有位置,或cookie。

同意?不同意?想法?

有很多不同的问题和设计选择,这些选择可以决定在哪里可以实际缓存信息,无论是cookie,session还是其他提供商。

当然,第一个问题是您是否应该根本可以缓存它。当然,对于不断访问数据库以获取相当静态信息的问题。但是,能够立即将某人锁定的同样担忧。

仅当不需要立即响应时,缓存才能可行。因此,对于缓存授权而言,不可能有最佳实践。.如果您的应用程序不需要该级别的安全性,当然也没有最佳实践。

假定上述不是问题,然后存在与位置的交易。

cookie
如果将其放入cookie中,则可以捕获并随后重播。另外,它会稍微增加您的互联网流量,因为cookie在每个请求下都会传输。

会话
如果将其放入会话中,则要么将自己限制为单个Web服务器,要么必须将会话状态存储在整个Web Farm可以访问的位置中。如果您采用后一条路线,那么您很可能会在数据库中存储会话,从而完全浪费了您将其开始的原因。

memcache或其他
这类似于在会话中存储角色。但是,它通常存储在内存中,通常很快。缺点是,对于负载平衡的网络农场,这可以增加另一个失败点...除非正确聚类。在这一点上,您已经增加了项目开发,部署和维护成本....


最终没有最好的做法。只有一堆非常依赖情况的权衡。坦率地说,对于这种类型的数据,我根本不会缓存它。它通常相对较小,并且查询通常很快。如果我们谈论成千上万的用户,我可能会考虑,但是在那个级别上,还有许多其他操作方面的考虑,最终将在这里显而易见。

在我看来,您在问一个荒谬的问题。在他们的右脑中,没有人会在身份验证cookie中存储角色数据。ASP.NET不这样做,因为它们提供了将其存储在加密单独的cookie中的roleprincipal。

无论如何,整个cookie的问题都是毫无意义的,因为这是roleprincipal的实现细节。该应用不应了解存储角色数据的位置。

所以我对您的问题是...为什么我们甚至进行讨论?您是在问做一些与系统如何完成的事情是最好的做法,然后争论为什么您不应该以这种方式这样做。

另外,您对RoleProvider必须处理cookie的评论是不正确的。Roleprovider不会创建RolePrincipal,这是在框架内完成的。是否使用cookie的选择不在RoleProvider中,而是由RoleManagerModule Framework类提供的选择,而IPrincipal S的方式是由框架实例化的。

RolePrincipal中的示例与RoleProvider无关。实际上,RoleManagerModule控制此功能。RoleManagerModule是一个HttpModule,安装到IIS中并作为管道的一部分运行。它甚至都不知道RoleProvider,基本上这意味着角色是在非常低的cookie中填充的,当Roleprovider开始运行时,如果它找到了已经存在的角色,它就可以了什么都没有。

最新更新