是否值得转向SimpleMembership

时间:2013-10-14 19:39:50

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-membership simplemembership

我有一个尚未发布的项目但我不会很快就会在几天前将其从mvc3移至mvc4并且在阅读时我看到了这个新的安全提供商SimpleMembership。 我现在实施安全性的方法是使用MembershipProviderFormsAuthentication

  • 我已实施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 个答案:

答案 0 :(得分:2)

为了理解SimpleMembership及其如何从以前的成员资格实施演变而来,我建议阅读原始参考“Using SimpleMembership With ASP.NET WebPages (Matthew Osborn)”,以及我对“What is MVC4 security all about?”的更详细解答。更好地理解它。总结这些参考文献:

  • SimpleMembership
    • 是涵盖SimpleMembershipProviderSimpleRoleProvider
    • 的术语
    • 是与表单身份验证
    • 一起使用的存储和功能提供程序
    • 在ASP.NET Forms和ASP.NET MVC网站中工作,也可以在ASP.NET Web API和SignalR中使用,以提供统一的身份验证和授权模型。
  • SimpleMembershipProvider
    • 通过ExtendedMembershipProvider抽象基类向原始MembershipProvider添加新功能,例如与开箱即用的OAuth提供程序集成
    • 创建4个默认表,您不会/不应该与之交互(webpages_Membershipwebpages_OAuthMembershipwebpages_Roleswebpages_UsersInRoles)和一个({{1} })你的结构是你想要的
    • UserProfile助手类一起使用以添加新功能
    • 从原始成员资格中的单个xml字段中存储的“用户配置文件”移动到新WebSecurity表中的每列更易管理的属性(可使用EF完全自定义)

回答您的具体问题:

  

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

您通常不会直接与前缀为UserProfile的表进行交互,因为webpages_Membership等中存在API级别功能,以执行您需要的所有业务功能。但是,没有什么可以阻止您通过存储过程与WebSecurity进行交互,如果您不想利用API,您甚至可以通过sprocs与UserProfile表进行交互(但是如果你这样做,你只会复制SimpleMembership的所有好处)。

  

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

这在很大程度上取决于你想做什么,但到目前为止,我还没有必要为任何真实世界的应用程序做这件事。我已经构建并添加到现有的API中,但没有替换它们。

  

3)我看到它种子数据库创建表。我有我的表用户,配置文件,角色和UsersInRoles我可以将它应用于我的自定义架构?

如果您要迁移到SimpleMembership,则必须将这些数据移植到表webpages_webpages_Membershipwebpages_OAuthMembershipwebpages_Roleswebpages_UsersInRoles 。但请注意UserProfile可以调用任何您想要的内容,您不必将其称为UserProfile

  

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

有点难以理解您的要求,但UserProfile执行以下操作:

  • WebSecurity.CreateAccount
  • 中创建记录 如果您使用webpages_Membership
  • 可选择向UserProfile添加属性

如果您想在整个数据库中执行其他操作,则需要在致电WebSecurity.CreateUserAndAccount后拨打该电话。您可以使用WebSecurity.CreateAccount

进行此交易

但是,如果你想通过一次调用TransactionScope来包装这一切,并让它调用你自己的域方法和存储过程,你必须通过继承WebSecurity.CreateAccount来创建自己的提供者(或者来自SimpleMembershipProvider)。当ExtendedMembershipProvider然后调用WebSecurity.CreateAccount时,它将遵循您的自定义逻辑


<强>摘要

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

  • UserProfile:与EF或任何其他数据库开发方法配合良好的用户数据的每列属性存储
  • 与OAuth集成,允许您轻松使用Google,Facebook等身份验证
  • ExtendedMembershipProvider.CreateAccount形式的高级业务功能API,以及WebSecurity
  • 对现有功能的持续支持
  • 继续支持使用Authorize属性
  • 的角色
  • 与EF集成,以便您可以将UserProfile与您自己的表一起使用
  • 与ASP.NET Forms和MVC以及SignalR和Web API的标准表单身份验证集成。

如果这些可以帮助您,那么请迁移,否则将您的开发时间用于应用程序的新功能。

如果你决定迁移,那么“Migrating Legacy Apps to the New SimpleMembership Provider (Paul Brown)"很有用,总结如下:

  • 修改Membership,为每个属性设置一个字段,用于存储在xml中的旧用户配置文件属性
  • 将数据从UserProfile表迁移到aspnet_
  • 每个用户第一次再次登录时,更新其存储的密码以使用新的哈希模型而不是旧的webpages_模式(请参阅the footnote to my answer here了解如何执行此操作)

答案 1 :(得分:0)

@Andy Brown提出了很多好处。我会注意到任何人都认为Simplemembership基本上已经死了,并且很快就会出现ASP.Net Identity,并且很快就会出现在所有新项目中。这种短暂的会员产品。