代码之家  ›  专栏  ›  技术社区  ›  Brian Scott

当使用具有不同应用程序名称的多个RoleProvider时,如何防止重复的成员身份用户?

  •  1
  • Brian Scott  · 技术社区  · 14 年前

    我有一个成员资格提供程序,它使用的是“/”默认应用程序名。然后我有多个应用程序共享这个公共成员资格提供程序配置。每个应用程序都有自己的角色提供程序配置,它们都与成员资格提供程序共享同一个数据库,但使用不同的应用程序名称将它们的角色彼此隔离。

    当我创建一个成员时,就会创建一个用户记录,从而在所有应用程序中共享。然后,我创建每个应用程序特有的特定角色,因为它们使用不同的应用程序名称。

    我遇到的问题是,当我对已经存在的成员调用Roles.AddUserToRole时。roleprovider不会识别用户,因为成员身份的应用程序名称上下文和角色提供程序不同,因此它会继续为角色所属的应用程序名称创建新的用户记录。

    如果不在成员资格和角色提供程序之间共享应用程序名称,如何防止创建这些重复的用户记录?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Community dbr    7 年前

    这些记录实际上不是“重复的”。

    首先,要了解MembershipProvider和RoleProvider并不相互依赖,只是MembershipProvider.DeleteUser()方法中存在一些问题,稍后我将对此进行解释。

    成员身份的作用是对用户进行身份验证,并在身份验证的帮助下保护对资源的访问。

    角色的作用是通过角色分配来控制对资源的访问。

    这是两个独立的关注点,并不相关,无论aspnet\u用户的状态意味着什么。

    突出的问题是,用于连接所有提供者的值是 username userid guid类似,只为任何用户名创建一个aspnet\u users记录

    虽然看起来userId guid是“全局”标识符,但事实并非如此。

    因此,需要注意的是,如果您知道与下一步相关的问题,您可以通过对每个成员身份实例使用相同的applicationname,对每个角色实例使用不同的applicationname,来使用具有公共成员身份存储的独立角色提供程序。

    我前面提到的(非常愚蠢的)违反关注点分离的行为涉及到调用DeleteUser(deleteRelatedData)时SqlMembershipProvider所采取的操作。然后,SqlMembershipProvider的行为就好像它是这场战斗中唯一的狗一样,通过角色和配置文件来删除只使用它的键的记录,从而丢失了您希望丢失的记录。

    “约翰”因某种原因成为“被解雇的人”,并通过会员身份被删除。如前所述,在我们独特的场景中,成员记录被删除,但角色信息仍然保留。

    在业余时间,约翰浏览公司内部网,不敢相信他能做多少很酷的事情,作为一个傻瓜,他决定在人力资源模块给自己加薪。

    我已经介绍了一个与此非常类似的场景,并提供了一个简单修改的概念证明,以消除此问题 here here .

    这两种方法都比实现定制提供者更有吸引力。

    干杯,祝你好运。

    推荐文章