1

カスタムログイン、認証、およびロールベースのシステムを必要とするMVC4でWebアプリを作成しています。私の意図はSimpleMembershipとSimpleRoleを使用することですが、アプリ内での基本的な意味を理解するのに苦労しています。

私はすでにデータベース、たとえばDB1.mdfを持っており、userIdとUserNameを使用してUsersテーブルを作成しました。私は既存のデータベースでsimplemembershipを初期化する必要があると信じています??? また、Visual Studio 2012で作成されたデフォルトのインターネットテンプレートで行っているように、データベースが見つからない場合は、システム自体でデータベースを作成したくありません。

高度なことに感謝します...

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());
    }
  }

EDIT : 建設的な批判のおかげで、コントローラーを属性で装飾するコードを削除しました。これは、グローバルに追加することで既に問題が解決されているためです。この質問で説明したように、ユーザーがCookieで認証され、最初にAccountControllerを渡さずに他のコントローラーにリダイレクトされる可能性があることに気付くため、グローバルに使用しないことにした場合は、他のコントローラーをそれで装飾する必要があります。

また、Jon Galloway はこの投稿で、次を使用して既存のデータベースを参照する方法を示しています。

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