1

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

我已经有了数据库,例如 DB1.mdf,并使用 userId 和 UserName 创建了用户表。我相信我需要用现有数据库初始化 simplemembership ???而且我不希望系统在找不到时自行创建数据库,就像在 Visual Studio 2012 创建的默认 Internet 模板中所做的那样。

非常感谢先进...

4

2 回答 2

-1

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

于 2012-12-14T18:39:30.470 回答
-1

你需要WebSecurity.InitializeDatabaseFile告诉 MVC.NET 你已经有一个数据库和一个用户表。然后,确保提供程序在初始化时使用它。因此,创建一个ActionFilterAttribute可确保初始化 Simple Membership 提供程序的方法,例如:

[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 进行身份验证并重定向到其他控制器,而无需先通过您的 AccountController。

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

WebSecurity.InitializeDatabaseFile("SecurityDemo.sdf", "Users", "UserID", "Username", true);
于 2012-12-14T18:25:42.307 回答