代码之家  ›  专栏  ›  技术社区  ›  1110

转到SimpleMembership值得吗

  •  1
  • 1110  · 技术社区  · 11 年前

    我有一个项目还没有发布,我不会很快发布,但几天前我把它从mvc3移到了mvc4,在阅读时我看到了这个新的安全提供商 SimpleMembership .
    我现在实现安全性的方法是使用 MembershipProvider FormsAuthentication :

    • 我已经实现了ICustomPrincipal
    • 我已经实现了CustomPrincipalSerializeModel
    • 我已经实施了IPrincipal

    要注册用户,我使用:

     MembershipCreateStatus status;
                Guid g = Guid.NewGuid();
                Membership.CreateUser(model.User.Email.Trim(), model.Password.Trim(), model.User.Email.Trim(), null, null, true, g, out status);
    
                if (status == MembershipCreateStatus.Success)
    ...
    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
                                 1,
                                 tUser.Email,
                                 DateTime.Now,
                                 DateTime.Now.AddDays(60),
                                 true,
                                 userData);
    
                        string encTicket = FormsAuthentication.Encrypt(authTicket);
                        HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
                        Response.Cookies.Add(faCookie);
    ...
    

    但正如我所看到的,SimpleMembership看起来更干净了,我想把项目转移到它上面
    但我对此有一些疑问:

    1) 我对所有数据库操作都使用存储过程——我根本不使用EF。如果我使用SimpleMembership,是否可以在没有EF的情况下使用它?
    2) 我需要为现实世界的应用程序建立自定义的SimpleMembership吗?
    3) 我看到它种子数据库创建表。我有我的桌子 Users, Profiles, Roles and UsersInRoles 我可以将其应用于我的自定义模式吗?
    4) 如果我想打电话 WebSecurity.CreateAccount(...) 我想从负责调用创建用户的存储过程的域项目中调用一些我的自定义方法。我必须使其自定义吗?如果必须这样做,是否有一些资源可以解释如何使其为用户和角色自定义?

    2 回复  |  直到 11 年前
        1
  •  2
  •   Community CDub    8 年前

    为了理解SimpleMembership以及它是如何从以前的Membership实现演变而来并依赖于它的,我建议阅读原始参考资料“ Using SimpleMembership With ASP.NET WebPages (Matthew Osborn) “,以及我对” What is MVC4 security all about? “以更好地理解它。总结这些参考文献:

    • 简单成员身份
      • 是一个涵盖两个方面的术语 SimpleMembershipProvider 以及 SimpleRoleProvider
      • 是与表单身份验证一起使用的存储和功能提供程序
      • 可在ASP.NET Forms和ASP.NET MVC网站中使用,也可在ASP.NET Web API和SignalR中使用,以提供统一的身份验证和授权模型
    • 简单成员身份提供程序
      • 通过向原始MembershipProvider添加新功能 ExtendedMembershipProvider 抽象基类,例如与开箱即用的OAuth提供程序的集成
      • 创建4个不需要/不应该与之交互的默认表( webpages_Membership , webpages_OAuthMembership , webpages_Roles , webpages_UsersInRoles )还有一个( UserProfile )哪一个是你的,可以随心所欲地构建
      • 使用 WebSecurity 用于添加新功能的helper类
      • 从原始Membership中存储在单个xml字段中的“用户配置文件”移动到新Membership中每列更易于管理的属性 用户配置文件 表格(可使用EF进行完全定制)

    要回答您的具体问题:

    1) 我对所有数据库操作都使用存储过程——我根本不使用EF。如果我使用SimpleMembership,是否可以在没有EF的情况下使用它?

    您通常不会直接与前缀为 webpages_ 因为中有API级别的函数 Membership , 网络安全 以完成您所需的所有业务功能。然而,没有什么可以阻止你与 用户配置文件 通过存储过程,如果您不想利用API,您甚至可以与 网页_ 表也可以通过存储过程进行复制(但如果这样做,您只会复制SimpleMembership的所有好处)。

    2) 我需要为现实世界的应用程序建立自定义的SimpleMembership吗?

    这在很大程度上取决于你想做什么,但到目前为止,我还没有为任何现实世界的应用程序这样做。我在现有API的基础上构建并添加了这些API,但没有替换它们。

    3) 我看到它种子数据库创建表。我有表Users、Profiles、Roles和UsersInRoles,我可以将其应用于我的自定义架构吗?

    如果要迁移到SimpleMembership,则必须将其中的数据移植到表中 网页_成员资格 , 网页_ OAuthMembership , 网页_角色 , 网页_用户角色 用户配置文件 然而,请注意 用户配置文件 可以叫任何你想叫的名字,你不必叫它 用户配置文件 .

    4) 如果我想调用WebSecurity.CreateAccount(…),并且我想从负责调用创建用户的存储过程的域项目中调用一些我的自定义方法,我必须使其自定义吗?如果必须这样做,是否有一些资源可以解释如何使其为用户和角色自定义?

    然而,理解你的要求有点困难 WebSecurity.CreateAccount 执行以下操作:

    • 在中创建记录 网页_成员资格
    • 可以选择将财产添加到 用户配置文件 如果您使用 WebSecurity.CreateUserAndAccount

    如果您想在数据库中执行其他操作,则需要在调用之后调用 网站安全创建帐户 。您可以使用 TransactionScope

    然而,如果您想将这一切封装在一个调用中 网站安全创建帐户 并使其调用您自己的域方法和存储过程,您必须通过继承来创建自己的提供程序 简单成员身份提供程序 (或来自 扩展成员资格提供程序 ). 什么时候 网站安全创建帐户 然后打电话 ExtendedMembershipProvider.CreateAccount 它将遵从您的自定义逻辑


    总结

    那么我会迁移吗?SimpleMembership的好处是:

    • UserProfile:用户数据的每列属性存储,与EF或任何其他数据库开发方法配合良好
    • 与OAuth集成,使您可以毫不费力地使用谷歌、脸书等身份验证
    • 形式为的高级业务功能API 网络安全 ,以及对现有功能的持续支持 会员
    • 继续支持与 Authorize 属性
    • 与EF集成,以便您可以将UserProfile与自己的表一起使用
    • 与ASP.NET Forms和MVC的标准Forms Authentication集成,还与SignalR和Web API集成。

    如果这些对您有帮助,那么就迁移,否则就把开发时间花在应用程序的新功能上。

    如果您决定迁移,那么“ Migrating Legacy Apps to the New SimpleMembership Provider (Paul Brown)" 是有用的,概括为:

    • 修改 用户配置文件 为存储在xml中的旧用户配置文件财产的每个属性设置一个字段
    • 从迁移数据 aspnet_ 表到 网页_ 桌子
    • 每个用户第一次再次登录时,更新他们存储的密码,以使用新的哈希模型而不是旧的哈希模型 会员 一个(参见 the footnote to my answer here 关于如何做到这一点)
        2
  •  0
  •   runxc1 Bret Ferrier    8 年前

    @安迪·布朗提出了很多好的观点。我要向任何了解这一点的人指出,Simplemembership基本上已经消亡,而且在ASP.Net Identity发布后不久,它就短暂地存在了,并且在所有新项目中都使用它。如此短暂的会员产品。