.net 使用MVC 2.0定制角色Provider

.net 使用MVC 2.0定制角色Provider,.net,asp.net-mvc,asp.net-membership,roleprovider,.net,Asp.net Mvc,Asp.net Membership,Roleprovider,我在应用程序中设置了自定义成员资格和角色提供程序。在ASP.Net Webforms中,我使用相同的提供程序,并且在编译和运行应用程序时,由于web.config中的引用,提供程序被初始化 当我将其移动到MVC并将断点放在这些类的初始化方法中时,断点不会被命中 奇怪的是:如果我在一个控制器中使用[AuthorizeRoles=MYROLE]进程并点击该操作,那么它就会转到Roleprovider并自动调用GetRolesForUser,但仍然不会点击初始化。这是一个问题,因为我需要在调用任何方法

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

当我将其移动到MVC并将断点放在这些类的初始化方法中时,断点不会被命中

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

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


我必须在MVC中手动初始化它们,还是我遗漏了什么?

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
}

然后在您的操作中使用[MyAuthorizeRole=MYROLE]。

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
}

然后在您的动作中使用[MyAuthiReOL[MyLoe]。

两件事要考虑的是,首先成员和角色提供程序是静态的,通常只在应用程序中第一次访问它们时才初始化。当在Web.Config中正确设置时,它们将在首次访问时调用initialize

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

另外,在获取成员资格提供程序的实例时,不要通过创建类ie var provider=new MyMembershipProvider的新实例来实现,因为这不会调用initialize方法。请确保通过Membership.provider获得您的提供程序,它将处理正确配置的web.config提供程序的所有设置

仔细查看AccountModels文件第101行中的默认MVC 2应用程序,可以得到一个很好的示例

_provider = provider ?? Membership.Provider;
第一次访问它时,它将实例化默认成员资格提供程序并调用initialize。之后,它对应用程序保持静态,直到应用程序从内存中卸载后才会再次调用。停止vs web开发服务器

此外,获取特定会员资格提供者的另一种类似方法也可以在以下网址找到:


希望这有助于:

考虑两件事:首先,成员和角色提供者是静态的,通常只在应用程序中第一次访问它们时才初始化。当在Web.Config中正确设置时,它们将在首次访问时调用initialize

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

另外,在获取成员资格提供程序的实例时,不要通过创建类ie var provider=new MyMembershipProvider的新实例来实现,因为这不会调用initialize方法。请确保通过Membership.provider获得您的提供程序,它将处理正确配置的web.config提供程序的所有设置

仔细查看AccountModels文件第101行中的默认MVC 2应用程序,可以得到一个很好的示例

_provider = provider ?? Membership.Provider;
第一次访问它时,它将实例化默认成员资格提供程序并调用initialize。之后,它对应用程序保持静态,直到应用程序从内存中卸载后才会再次调用。停止vs web开发服务器

此外,获取特定会员资格提供者的另一种类似方法也可以在以下网址找到:


希望这有帮助:

您应该在角色提供程序的构造函数中调用Initialize。@Nissan Fan:为什么我必须调用Initialize
在AP WebForms中,由于在web.config中设置了成员身份,它会自动调用Initialize方法。您应该在角色提供程序的构造函数中调用Initialize。@Nissan Fan:为什么在AP WebForms中,由于设置了成员身份,它会自动调用Initialize方法呢在web.config上?