【问题标题】:How to initialize simple membership in ASP.NET MVC4如何在 ASP.NET MVC4 中初始化简单的成员资格
【发布时间】:2014-03-06 18:09:58
【问题描述】:

如何在 ASP.NET MVC4 中初始化简单的成员关系

您好,我正在研究 ASP.NET MVC4。 如您所知,ASP.NET MVC4 中禁用了成员资格/身份验证机制; 如果我们想启用它,我们需要:

1) 编辑后续行(在SimpleMembershipInitializer类的构造函数中,文件InitializeSimpleMembershipAttribute.cs)

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "users", "id", "username", autoCreateTables: true);

2) 在您的 Web.Config 部分中添加一个新密钥。

<appSettings>
    <add key="enableSimpleMembership" value="true" />
    ...
</appSettings>

对吗? 你可以找到一些信息herehere

注意:我已经在我的数据库中创建了表 'users',DefaultConnection 设置正确。

编辑:让“DefaultConnectionString”为

  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet-SimpleAuthenticationMvc4-20140209174604;Integrated Security=SSPI" providerName="System.Data.SqlClient" />
  </connectionStrings>

当我尝试在我的 Web 应用程序中“登录”时,我在调用 EnsureInitialized() 时收到 TargetInvocationException: 这里是我的 InitializeSimpleMembershipAttribute 类的完整源代码:

/* class MyApp.Filters.InitializeSimpleMembershipAttribute */

namespace MyApp.Filters
{
    [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
            // HERE i _always_ get TargetInvocationException
            LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
        }

        private class SimpleMembershipInitializer
        {
            public SimpleMembershipInitializer()
            {
                Database.SetInitializer<UsersContext>(null);

                try
                {
                    using (var context = new UsersContext())
                    {
                        if (!context.Database.Exists())
                        {
                            // Create the SimpleMembership database without Entity Framework migration schema
                            ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                        }
                    }

                    /* DefaultConnection and table 'users' should/seems to be OK */
                    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "users", "id", "username", autoCreateTables: true);

                }
                catch (Exception ex)
                {
                    ...
                }
            }
        }
    }
}

有人建议我,这个错误可能意味着简单的成员资格在应用程序的另一部分被初始化,但我不明白这可能发生在哪里: 这是我的 global.asax.cs 的文本:

/* file global.asax.cs */

namespace MyApp
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }
    }
}

如您所见,没什么奇怪的。 我也尝试在文件 global.asax.cs 中移动,正如这里所建议的那样,但即便如此我也得到了同样的例外。

我没有特殊要求:我只想登录我的 MVC 4 应用程序,就像我之前编写的 MVC3 应用程序一样。

谁能告诉我错误在哪里?

谢谢!

【问题讨论】:

    标签: asp.net-mvc-4 authentication asp.net-membership simplemembership targetinvocationexception


    【解决方案1】:

    好的,我假设您想使用现有的 users 表,对吗? “DefaultConnection”是你的连接字符串吗?我假设不是。所以你应该改用你的连接字符串。

    最初我也遇到了初始化问题,所以我宁愿放弃过滤器并直接在 global.asax 中初始化它

    if (!WebSecurity.Initialized)
                {
                    WebSecurity.InitializeDatabaseConnection("YOUR_DB_CONTEXT", "USER_TABLE", "ID_COLUMN", "USERNAME_COLUMN", true);
                }
    

    我发布了关于设置它的教程Here。我认为它可以帮助你。

    【讨论】:

    • 嗨@Lokesh,感谢您的回复。是的,我的“DefaultConnectionString”应该是正确的。
    • 好的。您是否尝试过放弃过滤器并直接对其进行初始化?
    • 是的,我的“DefaultConnectionString”应该是正确的。我在帖子中添加了一些编辑:它是“like-is-supposed-to-be”(格式良好)吗?现在我有三个小问题:a)通过添加提供程序来修改 System.web 是强制性的吗?我读过的教程都没有谈到它! b) 在实践中,ASP.NET MVC 4“简单成员”和普通“本地登录”有什么区别?
    • c) 在哪里——也就是说,在哪个方法中——应该被称为 WebSecurity.CreateUser("Username","Password"); ?
    • a) 我不确定,但我猜应该有必要指定成员资格提供程序以及连接字符串。我还遵循了许多教程,发现此设置可以正常工作。 b)我假设“本地登录”是指.net会员资格,对吗?所以有很多不同,但主要是简单的成员资格让您使用您的数据库表来获取用户,这会产生更好的用户配置文件和单个数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    相关资源
    最近更新 更多