如何将 Membership API 与自己的应用程序相关数据结合使用?

Posted

技术标签:

【中文标题】如何将 Membership API 与自己的应用程序相关数据结合使用?【英文标题】:How to combine using Membership API with own application related data? 【发布时间】:2011-09-25 19:42:20 【问题描述】:

在 asp.net 4 中设计一个新应用程序 我必须决定如何使用 MS SQL Membership API 以及我自己在 MS SQL 数据库中的数据。首先,我需要以比 Profile 提供者支持的更灵活的方式存储和访问用户配置文件数据。其次,我想链接其他用户相关信息(例如订单)。

无论您将 aspnetdb 表存储在何处(在单独的数据库中或与您的数据在同一个数据库中),问题都在于如何保持数据同步。

经过研究,我看到以下相关选项: 1. asp_Users中的外键UserId(建议在this教程中)。 2. 无外键——使用交易(建议here)。 3. 无外键——使用自定义的AccountController(不管是什么,建议here)。 4. 将 Membership UserId (uid) 与自定义 UserId (int) 链接的附加表。 5. ...

一方面我喜欢第一个解决方案,因为它非常简单,并且在官方的 asp.net 教程中被推荐。

另一方面,反对者相当合理地指出,使用外键打破了提供者的一般概念,提供者应该有助于分离关注点并且可以互换。但不幸的是,它们并没有过多地介绍实施细节,因此很难根据相关性和实施难易程度来评估这些建议。

那么解决这个问题的最佳选择是什么?此外,实施情况如何?仅使用额外的 ADO.NET 或 LINQ 等代码就足够了吗,还是值得实现自定义成员资格和/或配置文件提供程序?

提前谢谢你。

【问题讨论】:

【参考方案1】:

第一种是最简单的方法。在相关表中添加用户的 GUID 作为外键(例如 Ordered_by)。我看不出它在哪里打破了分离的关注点。如果您想将订单记录保留在数据库中,您还必须保留已订购的用户,这非常有意义。

我在当前的应用程序中成功使用了选项 4。我创建了一个表aspnet_UserID,其中idUser int 作为主键,fiUser(aspnet_Users 的GUID)作为外键。这是模型:

(注意:User 是通过aspnet_regsql.exe 创建的标准aspnet_Users 表,aspnet_UserId 是我的自定义表,它将每个 Guid 映射到我的 int-ID)

现在我只将我的idUser 作为 FK 存储在所有相关表中(例如在您的订单表中)。这具有更少存储空间和更易读的用户 ID(我永远记不起 GUID)的优势。也许它与这个“包装表”更加分离,但这不是我的主要意图。

如果您想控制行为,可以更改外键上的 delete-rule。如果您愿意,请将其设置为 Cascade想要删除您正在删除的用户订购的所有订单,或者如果您想保留此订单,请将其设置为 no Action

我不能为个人资料问题提出任何替代方案,因为您没有提到“需要以比个人资料提供者支持的更灵活的方式存储和访问用户个人资料数据”的意思。

【讨论】:

谢谢你的回答,第四个选项看起来很有趣。所以你认为SQL Membership Provider(+一点自定义数据访问代码)对于这个场景足够并且需要实现自定义Profile Provider取决于 关于我对个人资料数据的特殊要求,我说对了吗? @Kirill:据我所知,不知道您的确切要求,是的。【参考方案2】:

您应该考虑编写自己的自定义成员资格提供程序,根据需要使用表/数据(而不是使用 ASP.NET 提供的架构)。

请参阅此 MSDN 示例(schema、code)以编写自定义提供程序 - 此示例使用 OLEDB 访问数据库。另一个示例是here - 它使用活动目录作为存储。

【讨论】:

以上是关于如何将 Membership API 与自己的应用程序相关数据结合使用?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.net Membership角色与权限管理

使用 .Net Membership / Roles 支持自定义授权/访问规则

Membership ChangePassword(散列)将当前密码与旧密码字段匹配

membership与成员资格

ASP.NET MVC2 Membership:如何获取登录用户的 userID 和 roleID?

华为会员开放服务(Membership Kit),助力移动应用快速建设会员生态