簡體   English   中英

如何在 ASP.NET MVC4 中初始化簡單的成員資格

[英]How to initialize simple membership in ASP.NET MVC4

如何在 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>

正確的? 您可以在此處此處找到一些信息。

注意:我已經在我的數據庫中創建了表“用戶”,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 應用程序一樣。

誰能建議我錯誤在哪里?

謝謝!

好的,我假設您想使用現有的用戶表,對嗎? “DefaultConnection”是你的連接字符串嗎? 我假設不是。 所以你應該改用你的連接字符串。

最初我也遇到了初始化問題,所以我更喜歡放棄過濾器並直接在 global.asax 中初始化它

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

我在此處發布了有關設置它的教程。 我認為它可以幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM