我应该从哪里开始选择和实现ASP.net MVC 3用户/角色系统?

时间:2012-03-20 11:41:47

标签: asp.net-mvc authentication

这里有太多的信息和术语,我发现很难开始考虑用户。我有什么选择来创建基于用户的ASP.net MVC 3 Web应用程序?我已经阅读了会员资格,提供商,授权,身份验证,会话,Cookie,角色和个人资料,但我似乎无法掌握如何处理用户事务的大局。

在这里使用内置微软解决方案有哪些优缺点?甚至叫什么? 我可以只使用自己的数据库(我想先工作数据库)吗?

在我看来,我想是这样的:我在数据库中拥有用户和角色。用户有角色。我想拒绝访问某些操作,具体取决于用户是否已登录并具有特定角色。我是否过度简化了这个问题?我应该从哪里开始?

目前我正在考虑做一个100%的家庭酿酒系统,就像我使用PHP开发一样,但是因为我觉得这样的信息太多了,所以这不是一个好方法。

2 个答案:

答案 0 :(得分:1)

您需要用户和角色,即您希望对用户进行身份验证并使用角色授予他们权限。我强烈建议不要像在PHP中那样滚动自己。相反,我建议使用.NET“提供程序”服务 - 特别是MembershipProvider(用于身份验证)和RoleProvider(用于授权)。

您仍然可以将提供者与您自己的数据库一起使用,它们不是代码的独占或排他性。但是,我建议不要在Provider的用户或成员表中存储特定于应用程序的用户信息。相反,您可以拥有自己的代码优先User,并通过用户的用户名将其链接到会员系统。

我推荐这个的原因是因为它减少了你必须做的工作量。您无需担心加密或散列密码 - 提供商会为您执行此操作。您拥有完整的API来通过System.Web.Security命名空间控制您的用户和角色。

至于Profile,这是一个您不需要使用的独立提供者服务。它允许您存储有关用户的信息,无论他们是否已在系统中注册用户帐户。从技术上讲,您可以拥有“匿名用户”,但任何创建基于密码的登录的人都被称为“成员”。

关于cookie,.NET中用户的身份验证是通过FormsAuthentication类完成的。使用System.Web.Security.Membership对用户进行身份验证后,您可以调用FormsAuthentication.SetAuthCookie来编写身份验证Cookie。这会将User及其Roles完全集成到Controller.User属性中,该属性实现IPrincipal接口。您可以使用此对象获取用户的名称,并找出他们所处的角色。

回复评论

answered a very similar question here。基本上,取决于你是否拥有一个完全独立的数据库中的成员资格而不是你的应用程序,但我认为这是一个很好的做法,因为我已经做了很多这样的事情,我没有抱怨。特别是如果您首先使用代码,因为如果您使用DropCreateDatabaseIfModelChangesDropCreateDatabaseAlways初始化程序,则可能会丢失整个数据库。

还有一个新的会员提供者。我认为NuGet包被称为“ASP.NET Universal Providers”,它们位于System.Web.Providers命名空间而不是旧的System.Web.Security命名空间。我还没有机会与它们合作,但从我收集的内容来看,它们首先与代码更兼容。首先,这些表的名称不是aspnet_Foo,并且没有在db中创建的视图或存储过程。表格名称只是普通dbo.Usersdbo.Roles等等。

至于将提供者用户与您的应用(内容)用户实体相关联,请参阅我上面链接的答案。最简单的方法是在内容数据库中为UserName添加一个字段,并将其链接到提供程序db的UserName。没有必要的外键,因为您将它们集成在应用程序级别,而不是数据库级别。

答案 1 :(得分:0)

我认为你应该先从内置解决方案开始,如果有一天你需要更多东西,它们很容易扩展(即使写一个好的提供商进行身份验证也不是真的琐碎。开始阅读this article,这是一个很好的起点。)

我认为写下这里的所有内容都不是一个好主意,这是一个很大的主题,我应该过多地简化一切,所以我会发布一些我觉得有用的链接。

刚开始,来自MSDN的文字:

授权确定是否应授予身份访问特定资源的权限。

身份验证是从用户获取身份凭证(如姓名和密码)并根据某些权限验证这些凭据的过程。

想象用户角色作为Windows用户和群组。例如,论坛的网站可能有一个名为 AUser 的用户,其角色如下:用户编辑主持人。在该网站中,他们可以授予一组允许的操作:用户可能会输入新帖子,编辑可能会更改其他人的帖子和主持人可以关闭或删除帖子或主题。通过这种方式,单个网页不需要了解用户,只需知道角色(DeletePost PostController方法可以用[Authorize(Roles = "Administrator, Moderator")]进行修饰。

开始阅读this very introductory article,它提供了更多有用的链接。