グローバルに実行することを計画している場合InitializeSimpleMembershipAttribute
は、MVC 4 の方法を使用するのがベスト プラクティスApp_Start\FilterConfig.cs
です。
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new InitializeMembershipAttribute());
}
}
Global.asax.cs を、MVC 4 の以前のバージョンと同じようにカプセル化する必要があるコードからクリーンに保ちます。きれいに仕上げます:
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();
}
}
AuthorizeAttribute メソッドは ActionFilterAttribute メソッドの前に実行されるため、タイプを AuthorizeAttribute に変更することもお勧めします (これが実際に行うことです)。(他の ActionFilter がセキュリティをチェックしており、派生したカスタム AuthorizeAttributes を許可している場合、これにより問題が少なくなるはずです)。
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Method,
AllowMultiple = false,
Inherited = true)]
public class InitializeMembershipAttribute : AuthorizeAttribute
{
private static SimpleMembershipInitializer _initializer;
private static object _initializerLock = new object();
private static bool _isInitialized;
public override void OnAuthorization(AuthorizationContext filterContext)
{
// Ensure ASP.NET Simple Membership is initialized only once per app start
LazyInitializer.EnsureInitialized(ref _initializer,
ref _isInitialized,
ref _initializerLock);
base.OnAuthorization(filterContext);
}
private class SimpleMembershipInitializer ...
}
}