自定义成员资格/角色/配置文件提供者没有继承MembershipProvider,RoleProvider等?

时间:2012-02-09 03:15:01

标签: c# asp.net inheritance asp.net-membership

是否有任何东西阻止我从完成会员资格,角色和配置文件自定义,而不继承自MembershipProvider等抽象类?

MSDN明确指出:“在实现自定义角色提供程序时,您需要继承RoleProvider抽象类。” (http://msdn.microsoft.com/en-us/library/system.web.security.roleprovider.aspx

然而,当我在这里时,我发现我真的根据我们的特定需求定制了整个事情,在很多情况下,我甚至没有实现继承的东西,而是我自己的办法。我正在做的一个例子是“GetAllRoles”方法。 .NET希望我实现一个返回字符串数组的方法。我发现这不符合我的需要,因为在我们的案例中,“角色”包含的信息远不仅仅是一个名称 - 例如,我们有多种语言的角色描述。所以我去创建了自己的自定义类ProjectRole,并使我的GetAllRoles方法返回List<ProjectRole>。然后在表示层,我可以使用简单的foreach循环从每个ProjectRole中提取所有数据。

同样,我不想为用户返回MembershipUser,而是返回ProjectUser,我可以提供自己的字段。

到目前为止,一切正常。但我还没完成。我想知道的是,我是以某种方式搞砸了自己,还没有意识到呢?登录时,我正在做

if (ProjectMembershipProvider.ValidateUser(UsernameTextBox.Text, PasswordTextBox.Text == true)
{
   FormsAuthentication.SetAuthCookie(UsernameTextBox.Text, true);
}

如果我没有弄错的话,我现在甚至都没有以任何方式使用ASP.NET提供程序,除了继承一堆东西,我最终抛出[Obsolete]标签因为我旋转我自己的方法。但是,令我担心的是,最后,我仍然希望能够使用某些内容,例如User.Identity.IsAuthenticatedUser.Identity.Name,以便在内部显示用户名,例如"Welcome " + User.Identity.Name。如果沿着这条路走下去,这是可能的吗?

tl; dr ---我是不是因为没有正确地使用我继承的提供商来解决自己而只是还没有意识到呢?

2 个答案:

答案 0 :(得分:3)

虽然Tim对实现的具体细节是错误的,但他的论点是正确的。如果您希望使用Membership API,那么必须从抽象类继承,因为API依赖于那些抽象类。 API无法知道要使用的接口。

但这并不意味着您必须使用Membership API。但是,正如蒂姆所提到的,你失去了会员的一大好处,那就是你可以插入一个通用的提供商,这完全独立于你的应用程序。

RoleProvider具有返回字符串的特定接口的原因是这些字符串可以与角色的标准声明(即User.IsInRole()等)进行比较。)这​​个内置管道一无所知您的扩展版本。如果您没有实现标准版本,如果您尝试使用固有功能,它将抛出异常。

有解决方案。成员资格,角色等只是其他系统的实现,尤其是IPrincipalIIdentity。如果您实现这些接口的自己版本,则可以完全绕过角色,成员资格等。然后,使用User.IsInRole()将调用您的IPrincipal实施,User.Identity.Name将返回您的自定义IIdentity实施中的数据。然后你放弃了对官方会员和角色api的支持(没有较低级别的Profile界面,Profile只是会员api的一部分)

你为什么要关心这些?因为框架整个安全基础架构是围绕它们构建的。如果您只是尝试使用会话变量来执行自己的安全性,那么您将拥有一个不安全且容易破损的系统。

答案 1 :(得分:0)

您不必从MembershipProvider,RoleProvider和ProfileProvider继承。

然而,如果你不这样做,那么你就会失去很多好处,因为那些知道如何与有关课程的人交谈。突然之间,你将不得不推出自己的机制: - 登录用户(不能使用OOTB登录/注销控件)
- 任何使用角色或成员资格类的东西,例如Roles.IsInRole(“Admin”)
- 将经过身份验证的用户详细信息存储在Cookie中 - 用户注册(好吧,OOTB的实施相当有限)
- 设置哪些页面/目录需要身份验证,以及如果用户尝试点击它们并且未经过身份验证该怎么办(使用MembershipProvider / RoleProviders,这是通过OOTB web.config元素完成的)
- 任何使用Authorize属性的东西

所有这些都可以毫不费力地克服。但是,滚动自己的主要不利之处在于您将身份验证/授权机制与您的站点紧密耦合,而使用MembershipProvider / RoleProvider实现,您可以创建一个可以简单地通过删除新DLL来替换您的成员系统的站点。 bin文件夹并更改web.config设置。

当然,您可以拥有自己继承的BetterMembershipProvider / BetterRoleProvider抽象类,但仍然具有松耦合。但是,您不能再将您的会员级别放入知道如何处理MembershipProviders的系统,例如许多现有的.Net网站,sharepoint,Dot Net Nuke等。