C# 帮助我决定是使用ASP.NET默认成员资格/角色提供程序还是编写自定义提供程序
昨天我花了很大一部分时间阅读这个主题,但仍然觉得我不确定该走哪条路。当涉及到身份验证和授权时,我来自一个“滚你自己的”背景。我们从未使用表单身份验证,更不用说成员身份API了。查看我们的旧代码,我们将使用会话变量来捕获/控制用户是否登录等。对于我即将开始的这个新项目,我想让我们回到我们应该开始做的事情上,即使用框架提供的工具 我已经有了一个我将使用的数据库模式,但是它不是一成不变的;如有必要,我可以对其进行更改。在这个模式中已经有一个Users表,它使用一个整数作为主键。此表还包含其他信息,如姓名和姓氏。我也有基于UserId的外键到其他表,比如Phone和Address。下面我概述了我想到的一些优点/缺点 默认提供程序 专业人士C# 帮助我决定是使用ASP.NET默认成员资格/角色提供程序还是编写自定义提供程序,c#,.net,asp.net,asp.net-membership,C#,.net,Asp.net,Asp.net Membership,昨天我花了很大一部分时间阅读这个主题,但仍然觉得我不确定该走哪条路。当涉及到身份验证和授权时,我来自一个“滚你自己的”背景。我们从未使用表单身份验证,更不用说成员身份API了。查看我们的旧代码,我们将使用会话变量来捕获/控制用户是否登录等。对于我即将开始的这个新项目,我想让我们回到我们应该开始做的事情上,即使用框架提供的工具 我已经有了一个我将使用的数据库模式,但是它不是一成不变的;如有必要,我可以对其进行更改。在这个模式中已经有一个Users表,它使用一个整数作为主键。此表还包含其他信息,如姓
- 更少的代码
- 能够利用所有相关的服务器控件,如登录、更改密码李>
- 有些控件可能对我不太有用。例如,在CreateUserWizard中,我可能需要在用户创建期间捕获其他信息,例如关联表中的电话和地址信息。不确定这是否会使此控件对我无效
- 我必须在关联的表(电话、地址)中为UserId创建外键,UserId是默认提供程序中的GUID李>
- 如果我创建了这些外键约束,而没有使用级联删除;我还需要删除外键表中的关联行。可能需要利用TransactionScope对象之类的东西来确保所有这些都是原子操作
- 能够利用现有的模式表
- 更容易将身份验证/授权提取到服务中
- 必须自己为大多数/所有事情提供实施
- 要使用任何控件,我必须在提供程序中提供它们所需的实现
谢谢。就我个人而言,我同意框架提供的内容。在这种情况下,没有理由使用您自己的身份验证 在过去,你可能想自己做事情,但现在没有理由这样做
我认为,如果你试图自己写这篇文章,你会重新创造轮子,需要花费太多的时间和资源才能把它做好。尤其是在处理安全问题时。如果您正在构建一个新的应用程序,我会毫不犹豫地使用asp.net默认提供程序。您可以随时决定不使用默认控件,并通过编程创建自己的控件。您还可以通过使用任何开源预创建的用户管理工具节省大量时间。同时,您可以随时扩展默认表中包含的信息。我最近不得不做出同样的选择,并决定继续创建自定义提供程序 我这样做的最大原因是默认的db模式。所有默认的db对象都是在dbo模式中创建的,并以“aspnet”或“vw_aspnet”等为前缀。对我来说,这是一个真正的关闭。如果尚未看到它们,请运行aspnet_regsql.exe创建它们 此外,Steven Sanderson在Pro ASP.NET MVC 2框架中说: …SqlProfileProvider使用了一种特别令人厌恶的数据库模式,其中配置文件条目存储为冒号分隔的名称/值对,因此基本上不可能进行查询 总的来说,遵循API是值得的,因为它可以清晰地分离关注点,跨项目重用,并与ASP.NET的其余部分集成,但您只希望在小型或一次性项目中使用内置SQL存储提供程序
我还没有完成创建自定义提供程序的整个过程(我在使用Azure Table storage时做了部分实现),但我计划在未来的多个项目中使用这些提供程序,因此我觉得这是值得的。就我个人而言,我使用SqlMembershipProvider作为独立实体,而数据库的其余部分在Oracle中。我从来不看数据库,所以名称和guid不会困扰我(看不见,想不起来)。它只是开箱即用,太棒了 在我的场景中,我在Oracle数据库中有一个用户表,在创建/删除成员资格用户(无GUID)时插入/删除该表。我认为成员数据库是“主”记录,Oracle表基本上用于支持表的引用完整性。这实际上不是在正式事务中完成的,但我使用try/catch来保持它们足够好的同步 角色提供者是非常有限的,如果你想要任何层次或动态角色,你会被敬酒的。但是它是一个完全独立于成员的系统,你不必使用它
控制还不错。它们中的很多都支持模板,因此您可以向模板中添加自己的控件,并且有大量事件可以挂接到模板中。不要害怕滚动您自己的控件,但是首先给默认控件一个机会。成员API的易用性确实有助于创建这些控件。我也在学习这种方法,模式对我来说似乎非常有限。我真的不想使用他们的guid作为外键。我必须在应用程序中编写自己的管理屏幕(管理员用户可以创建其他屏幕)