从 Visual Studio 2012 中 MVC 4 中的 SimpleMembership 开始



我正在 MVC 4 中创建需要自定义登录、身份验证和基于角色的系统的网络应用程序。我的目的是使用SimpleMember和SimpleRole,但在我的应用程序中很难开始并掌握它的基本含义。

我已经有数据库,例如DB1.mdf并且已经创建了带有userId和UserName的用户表。我相信我需要用现有数据库初始化简单会员资格???如果找不到,我不希望系统创建数据库本身,就像它在Visual Studio 2012创建的默认Internet模板中所做的那样。

非常感谢提前...

SimpleMember并不是为广泛的定制或集成到现有数据库而开发的。若要使用现有数据库,需要创建自己的成员资格提供程序,就像在 ASP.NET 中一样。您可以在此处找到有关创建自己的会员资格提供商的说明。

您需要使用WebSecurity.InitializeDatabaseFile告诉 MVC.NET 您已经有一个数据库和一个用户表。然后,确保提供程序在初始化时使用它。因此,请创建一个ActionFilterAttribute来确保初始化简单成员资格提供程序,例如:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
  public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
  {
    private static SimpleMembershipInitializer _initializer;
    private static object _initializerLock = new object();
    private static bool _isInitialized;
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      // Ensure ASP.NET Simple Membership is initialized only once per app start
      LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
    }
    private class SimpleMembershipInitializer
    {
      public SimpleMembershipInitializer()
      {     
        try
        {
          if (!WebSecurity.Initialized)
          {
            WebSecurity.InitializeDatabaseConnection("DefaultConnection", "Users", "UserId", "UserName", autoCreateTables: true);
          }
        }
        catch (Exception ex)
        {
          throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
        }
      }
    }
  }

然后,您需要注册过滤器:

public class FilterConfig
  {
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
      filters.Add(new HandleErrorAttribute());
      filters.Add(new InitializeSimpleMembershipAttribute());
    }
  }

编辑:由于建设性的批评,我删除了使用该属性装饰控制器的代码,因为全局添加它已经解决了这个问题。如果您决定不全局使用它,则需要使用它装饰其他控制器,因为正如此问题所述,您会注意到用户可能会使用 cookie 进行身份验证并重定向到其他控制器,而无需首先通过您的帐户控制器。

此外,Jon Galloway在这篇文章中展示了如何使用以下内容指向现有数据库:

WebSecurity.InitializeDatabaseFile("SecurityDemo.sdf", "Users", "UserID", "Username", true);

最新更新