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