1

我有一个尚未发布的项目,但我不会很快发布,但几天前我将它从 mvc3 移到了 mvc4,在阅读时我看到了这个新的安全提供程序SimpleMembership
我现在实现安全性的方式是使用MembershipProviderand 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(...)我想从域项目中调用一些我的自定义方法,该方法负责调用创建用户的存储过程我是否必须将其自定义,如果我必须这样做,是否有一些资源可以解释如何为用户和角色?

4

2 回答 2

2

要了解 SimpleMembership 以及它是如何从以前的 Membership 实现演变而来并依赖于以前的 Membership 实现的,我建议阅读原始参考“使用 SimpleMembership 与 ASP.NET WebPages (Matthew Osborn) ”,以及我对“什么是 MVC4 安全性”的更详细的回答到底是怎么回事? ”以便更好地理解它。总结这些参考资料:

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

要回答您的具体问题:

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

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

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

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

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

如果您要迁移到 SimpleMembership ,则必须将这些中的数据移植到表webpages_Membershipwebpages_OAuthMembershipwebpages_Roles和。但是,请注意,您可以随意调用它,而不必调用它。webpages_UsersInRolesUserProfileUserProfileUserProfile

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

有点难以理解您的要求,但是WebSecurity.CreateAccount执行以下操作:

  • webpages_Membership在和中创建记录
  • UserProfile如果您使用,可以选择添加属性WebSecurity.CreateUserAndAccount

如果您想在数据库中执行其他操作,则需要在调用WebSecurity.CreateAccount. 您可以使用TransactionScope

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


概括

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

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

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

如果您确实决定迁移,那么“将旧版应用程序迁移到新的 SimpleMembership Provider (Paul Brown)”很有用,总结如下:

  • 修改UserProfile为存储在 xml 中的旧用户配置文件属性的每个属性都有一个字段
  • 将数据从aspnet_表迁移到webpages_
  • 每个用户第一次再次登录时,更新他们存储的密码以使用新的哈希模型而不是旧的Membership(有关如何执行此操作,请参阅我的答案的脚注)
于 2013-10-22T15:54:43.643 回答
0

@Andy Brown 提出了很多好的观点。我会向任何对此进行说明的人指出,Simplemembership 基本上已经死了,并且随着 ASP.Net Identity 的出现而短暂存在,并且在所有新项目中都使用了它。如此短暂的会员产品。

于 2017-04-04T23:03:28.457 回答