首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从visual studio 2012中MVC 4中的SimpleMembership开始。

从visual studio 2012中MVC 4中的SimpleMembership开始。
EN

Stack Overflow用户
提问于 2012-12-14 22:13:56
回答 2查看 2K关注 0票数 1

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

我已经有了数据库,比如DB1.mdf,并且已经用userId和UserName创建了用户表。我认为我需要用现有的数据库初始化简单的成员关系?如果系统找不到数据库,我不希望它自己创建数据库,就像它在visual studio 2012创建的默认互联网模板中所做的那样。

非常感谢在进阶...

EN

回答 2

Stack Overflow用户

发布于 2012-12-15 02:25:42

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

代码语言:javascript
复制
[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);
        }
      }
    }
  }

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

代码语言:javascript
复制
public class FilterConfig
  {
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
      filters.Add(new HandleErrorAttribute());
      filters.Add(new InitializeSimpleMembershipAttribute());
    }
  }

编辑:多亏了建设性的批评,我删除了用属性修饰控制器的代码,因为全局添加它已经解决了这个问题。如果您决定不在全局范围内使用它,您将需要使用它来装饰其他控制器,因为正如在this question上所解释的,您会注意到,用户可能会使用cookies进行身份验证并被重定向到其他控制器,而无需首先通过您的AccountController传递。

此外,Jon Galloway还向in this post展示了如何通过使用以下命令指向现有数据库:

代码语言:javascript
复制
WebSecurity.InitializeDatabaseFile("SecurityDemo.sdf", "Users", "UserID", "Username", true);
票数 -1
EN

Stack Overflow用户

发布于 2012-12-15 02:39:30

SimpleMembership是not developed for extensive customization or integrating to existing databases。要使用现有的数据库,您需要创建自己的成员提供程序,就像在ASP.NET中一样。您可以在creating your own membership provider here上找到方向。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13880353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档