2

我有一个在应用程序中设置的自定义成员资格和角色提供者。在 ASP .Net Webforms中,我使用相同的提供程序,并且在编译和运行应用程序时,由于 web.config 中的引用,提供程序被初始化。

当我将它移到MVC并在这些类的“初始化”方法中放置断点时,不会命中断点。

奇怪的是:如果我在控制器中使用“[Authorize(Roles = "MYROLE")]”进程并点击该操作,那么它会转到 Roleprovider 并自动调用“GetRolesForUser”,但仍然不会触发初始化。这是一个问题,因为我需要在调用任何方法之前设置某些变量。

我知道我可以直接调用“Initialize”,但会认为这会像在 ASP Webforms 中那样自动完成。

我是否必须在 MVC 中手动初始化这些,或者我错过了什么?

4

2 回答 2

0

需要考虑的几件事,首先,Membership 和 Role 提供程序是静态的,并且通常仅在第一次在应用程序中访问它们时才被初始化。在 Web.Config 中正确设置后,它们将在首次访问时调用初始化。

通过使用一组基本的 Provider 和默认的 ASP.NET MVC 2 应用程序进行一些测试,我发现 RoleProvider 通常在应用程序启动时立即初始化。不过需要注意的一件事是,如果您想重新初始化提供程序,您必须停止您的开发 Web 服务器(或 iis express,或清除应用程序池)。这样应用程序就会重新启动。如果你不这样做,并且提供程序已经被初始化,它永远不会遇到那些断点,因为它已经运行了。

此外,在获取您的成员资格提供程序的实例时,不要通过创建类的新实例来实现(即 var provider = new MyMembershipProvider()),因为这不会调用初始化方法。请务必通过 Membership.Provider 获取您的提供程序,它将为您正确配置的 web.config 提供程序处理所有设置。

仔细查看 AccountModels 文件(~第 101 行)中的默认 MVC 2 应用程序提供了一个很好的示例。

_provider = provider ?? Membership.Provider;

第一次访问它时,它将实例化默认的成员资格提供程序并调用初始化。之后,它对应用程序保持静态,并且在应用程序从内存中卸载之前不会再次调用。IE。停止 vs web 开发服务器。

此外,还可以在以下位置找到获取特定成员资格提供程序的另一种类似方法:如何在自定义 MembershipProvider 上调用 Initialize?

希望这可以帮助 :)

于 2011-07-13T03:49:01.123 回答
-1

Jay,我想它们的工作方式与角色/成员资格提供程序在 ASP.NET WebForms 中的工作方式相同。

您应该尝试的一件事是创建将调用您的应用程序方法的自定义授权过滤器,如下所示:

public class MyAuthorizeAttribute: FilterAttribute, IAuthorizationFilter
{    
    public string Role { get; set; }

    #region IAuthorizationFilter Members    
        public void OnAuthorization(AuthorizationContext filterContext)    
        {        
            // add your logic here like 
            // var userRoles = MyCustomProvider.GetRolesForUser(filterContext.HttpContext.User.Identity);
            // if(!userRoles.Contains(Role))
            // .....
        }    
    #endregion
}

然后[MyAuthorize(Role = "MYROLE")]在你的行动中使用。

于 2009-12-08T17:30:26.343 回答