2010-06-17 39 views
4

我有一个现有的ASP.NET应用程序,拥有大量用户和大型数据库。现在我想在MVC 2中拥有它。我不想迁移,我从零开始做或多或少。我想保留的数据库并没有太多触及。ASP.NET MVC2和MemberShipProvider:他们一起走得怎么样?

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

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

我想了解后果,如果我不使用会员提供商。什么与此有关?我明白,在ASP.NET中,登录控件链接到提供者。使用MVC2自动生成的AccountModel可以很容易地更改为支持我现有的逻辑。

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

我可以俯视吗? 我有关于RoleProvider的相同问题。

输入是非常感谢。

回答

4

使用MVC,完全绕过Membership和Role提供程序框架很简单。有时候做这件事比实现自定义会员/角色提供者容易,特别是如果你的authn/authz模型不适合这些提供者的模型。

首先,你应该意识到,你不需要写一切从头开始,您可以使用核心Forms身份验证API,可独立使用的会员/角色提供程序框架

  • FormsAuthentication.SetAuthCookie - 呼叫该用户之后一直 认证,指定用户名
  • Request.IsAuthenticated - 如果SetAuthCookie被称为返回 真正
  • HttpContext.Current.User.Identity.Name - 返回调用指定SetAuthCookie

所以这里的用户名,你在MVC做什么绕过会员/角色提供程序:

  1. 认证:在您的 控制器,请使用您的自定义逻辑对用户 进行身份验证。如果 成功,请使用用户名称与 FormsAuthentication.SetAuthCookie

  2. 授权:创建自定义 授权属性(从 AuthorizeAttribute获得)。在 AuthorizeCore覆盖,实现 您的自定义授权逻辑, 取用户 HttpContext.Current.User.Identity.Name 和角色 属性AuthorizeAttribute基类中定义的角色。 请注意,您还可以在自定义授权属性中定义属性,并在授权逻辑中使用该属性。 例如,您可以将代表角色的属性定义为特定于您的应用的枚举值 ,而不是使用仅为字符串的Roles属性。

  3. 贴上你的控制器和行动的 定制的授权属性, 而不是默认的授权 属性。

1

虽然你最有可能可以没有一个自定义的会员提供这样做,我不知道你节省了很多努力。在我读this blog post之前,我认为实施一个很难,但实际上并非如此。基本上你这样做:

  1. 创建一个继承System.Web.Security.MembershipProvider的类。
  2. MembershipProviderabstract类,所以您很容易就会看到需要实现的方法。
  3. 这些名字很自我解释,所以你可能或多或少地复制你现有的逻辑。

可能最终做比你更需要这种方法 - 但另一方面,任何你可能希望现在还是一个需要会员供应商将已经有它的需求得到满足未来的使用。

1

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

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

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

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

+0

嗯,我仍然想从MembershipProvider的调用位置了解。在哪些情况下ASP.NET/MVC将使用配置的成员资格提供者?或者只有在我明确提及它时才使用它,比如在AccountModel中? – Sparhawk 2010-06-17 21:01:34

+1

必须在您的代码中调用成员资格提供程序,如您在VS中创建新MVC项目时生成的代码中所见。角色提供者OTOH由内置的Authorize属性调用。您可以创建一个自定义的授权属性并完全绕过成员/角色提供者(请参阅我的答案)。如果创建自定义的Membership/Role提供程序并不适合您尝试执行的操作,则这是完全有效的方法。 – DSO 2010-06-18 07:01:42

相关问题