Asp.net mvc ASP.NET MVC2和MemberShipProvider:它们配合得如何?

Asp.net mvc ASP.NET MVC2和MemberShipProvider:它们配合得如何?,asp.net-mvc,forms-authentication,membership-provider,Asp.net Mvc,Forms Authentication,Membership Provider,我有一个现有的ASP.NET应用程序,有很多用户和一个大型数据库。现在我想在MVC2中使用它。我不想迁移,我或多或少是从零开始迁移的。我想保留的数据库,不要接触太多 我已经有了我的数据库表,我还想保留我的LINQ到SQL层。我在当前的实现中没有使用成员资格提供程序(在ASP.NET 1.0中不受大力支持) 因此,要么我编写自己的会员资格提供商以满足数据库和应用程序的需要,要么我根本不使用会员资格提供商 我想了解如果我不使用会员资格提供商的后果。与此相关的是什么?我知道在ASP.NET中,登录控件

我有一个现有的ASP.NET应用程序,有很多用户和一个大型数据库。现在我想在MVC2中使用它。我不想迁移,我或多或少是从零开始迁移的。我想保留的数据库,不要接触太多

我已经有了我的数据库表,我还想保留我的LINQ到SQL层。我在当前的实现中没有使用成员资格提供程序(在ASP.NET 1.0中不受大力支持)

因此,要么我编写自己的会员资格提供商以满足数据库和应用程序的需要,要么我根本不使用会员资格提供商

我想了解如果我不使用会员资格提供商的后果。与此相关的是什么?我知道在ASP.NET中,登录控件链接到提供程序。使用MVC2自动生成的AccountModel可以轻松更改,以支持我现有的逻辑

当用户由AuthCookie标识时会发生什么?那么MVC是否使用会员资格提供商

我是不是忽略了什么? 关于RoleProvider,我也有同样的问题

非常感谢您的参与。

尽管您很可能不需要定制会员资格提供商就可以做到这一点,但我不确定您是否节省了那么多精力。在我读到这篇文章之前,我认为实现一个目标很难,但事实并非如此。基本上你是这样做的:

  • 创建一个继承
    System.Web.Security.MembershipProvider
    的类
  • MembershipProvider
    是一个
    abstract
    类,因此您可以很容易地看到需要实现哪些方法
  • 这些名称都是不言自明的,因此您可以或多或少地复制现有的逻辑

  • 使用这种方法,您最终可能会做得比您需要的更多,但另一方面,您现在或将来可能想要使用的任何需要成员资格提供程序的内容都将得到满足。

    此处提供了SQLMembershipProvider的源代码。以此为基础

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

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


    有人认为我不喜欢它:例如,不可能有一个事务跨越membershipsystem创建的用户和您自己数据库中的一些其他数据。但是它仍然工作得很好。

    使用MVC,完全绕过成员资格和角色提供程序框架很简单。有时,实现自定义成员身份/角色提供程序比实现自定义成员身份/角色提供程序更容易,特别是当您的authn/authz模型不太适合这些提供程序的模式时

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

    • FormsAuthentication.SetAuthCookie
      - 在用户被访问后调用此函数 已验证,请指定用户名
    • Request.IsAuthenticated
      -返回 如果调用了SetAuthCookie,则为true
    • HttpContext.Current.User.Identity.Name
      -返回调用SetAuthCookie时指定的用户名
    因此,以下是您在MVC中如何绕过成员资格/角色提供程序:

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

  • 授权:创建自定义 授权属性(派生自 授权属性)。在
    AuthorizeCore
    覆盖、实施 您的自定义授权逻辑, 接纳用户
    HttpContext.Current.User.Identity.Name
    以及角色中定义的角色 AuthorizeAttribute基类的属性。 注意:您还可以在自定义屏幕上定义属性 授权属性,并在授权逻辑中使用该属性。 例如,可以将表示角色的属性定义为枚举值 特定于您的应用程序,而不是使用角色属性,该属性只是一个字符串

  • 将控制器和操作与 自定义授权属性, 而不是默认的授权 属性


  • 嗯,我仍然想了解从哪里调用MembershipProvider。在哪些情况下,ASP.NET/MVC将使用配置的成员资格提供程序???还是仅当我在AccountModel中明确引用时才使用它?必须在代码中调用成员资格提供程序,正如您在VS中创建新MVC项目时生成的代码所示。角色提供程序OTOH由内置的Authorize属性调用。您可以创建一个自定义的Authorize属性并完全绕过成员资格/角色提供程序(参见我的答案)。如果创建自定义成员资格/角色提供程序不适合您尝试执行的操作,那么这是一种非常有效的方法。