ASP.NET MVC2和MemberShipProvider:它们如何结合在一起?

时间:2010-06-17 20:14:46

标签: asp.net-mvc forms-authentication membership-provider

我有一个包含大量用户和大型数据库的现有ASP.NET应用程序。现在我想在MVC 2中使用它。我不想迁移,我从头开始或多或少地进行迁移。我想保留的数据库,而不是太多。

我已经有了数据库表,我也希望将LINQ保留到SQL层。我在当前的实现中没有使用MembershipProvider(在ASP.NET 1.0中没有得到强烈支持)。

所以,要么我写自己的Membershipprovider来满足我的数据库和应用程序的需要,要么我根本不使用membershipprovider。

如果我不使用会员提供者,我想了解其后果。与此相关的是什么?据我所知,在ASP.NET中,Login-Controls链接到提供者。可以轻松更改使用MVC2自动生成的AccountModel以支持我现有的逻辑。

当用户被AuthCookie识别时会发生什么?那么MVC是否使用MembershipProvider?

我忽略了什么吗? 我对RoleProvider有同样的问题。

非常感谢输入。

3 个答案:

答案 0 :(得分:4)

使用MVC,可以简单地绕过成员资格和角色提供程序框架。有时这样做比实现自定义成员资格/角色提供程序更容易,特别是如果你的authn / authz模型不太适合这些提供者的模式。

首先,您应该意识到您不需要从头开始编写所有内容,您可以使用核心Forms身份验证API,可以单独使用成员/角色提供程序框架:< / p>

  • FormsAuthentication.SetAuthCookie - 用户访问后调用此方法 经过身份验证,请指定用户名
  • Request.IsAuthenticated - 退货 如果调用SetAuthCookie,则为true
  • HttpContext.Current.User.Identity.Name - 返回调用SetAuthCookie
  • 中指定的用户名

所以这是你在MVC中绕过会员/角色提供者所做的事情:

  1. 身份验证:在您的身上 控制器,验证用户 使用您的自定义逻辑。如果 成功,打电话 FormsAuthentication.SetAuthCookie 用户名。

  2. 授权:创建自定义 授权属性(源自 AuthorizeAttribute)。在里面 AuthorizeCore覆盖,实施 你的自定义授权逻辑, 吸引用户 HttpContext.Current.User.Identity.Name 以及角色中定义的角色 AuthorizeAttribute基类的属性。 请注意,您还可以在自定义上定义属性 授权属性并在授权逻辑中使用它。 例如,您可以将表示角色的属性定义为枚举值 特定于您的应用,而不是使用仅仅是字符串的角色属性。

  3. 将您的控制器和操作添加到您的 自定义授权属性, 而不是默认的授权 属性。

答案 1 :(得分:1)

虽然您很可能可以在没有自定义成员资格提供程序的情况下执行此操作,但我不确定您是否节省了这么多精力。在我阅读this blog post之前,我认为实施一个很难,但事实并非如此。基本上你这样做:

  1. 创建一个继承System.Web.Security.MembershipProvider的类。
  2. MembershipProvider是一个abstract类,因此您可以很容易地看到需要实施的方法。
  3. 这些名称非常自我解释,因此您可以或多或少地复制现有逻辑。
  4. 满足。

答案 2 :(得分:1)

SQLMembershipProvider的源代码在http://weblogs.asp.net/scottgu/archive/2006/04/13/442772.aspx可用。以此为基础。

一开始看起来有点多,但你只需要实现你需要的方法。

是的,使用了AuthCookie。是的,使用MembershipProvider是一个好主意,因为它是其他开发人员所熟知的。

有人认为我不喜欢它:例如,不可能有一个事务跨越成员系统创建用户以及您自己的数据库中的一些其他数据。但它仍然运作良好。