@H_403_1@我有一个在我的MVC控制器中使用的自定义成员资格/角色提供程序,我也希望能够访问ASP.NET MVC,所以我可以使用AuthorizationFilters等。由于有很多人实现了自定义提供程序,我想象很多人都做了这个,但是我没有想出来,也没有发现专门解决这个问题的帖子。
This post是我问题的另一面。在我的情况下,我的自定义提供程序与我的控制器工作良好,我想让MVC也使用它。
我的提供商实现了IoC /依赖注入设计。提供程序公开了超出基准成员资格/角色API的附加功能。在我的控制器中,我使用Castle Windsor创建实例。代码看起来类似于:
public class HomeController : Controller { IMembershipService _membershipService; public HomeController(IMembershipService membershipService) { _membershipService= membershipService; } } <castle> <components> <component id="MembershipService" service="IMembershipService,MyApp" type="MembershipService,MyApp" lifestyle="PerWebRequest"> <parameters> <connectionString>#{defaultConnectionString}</connectionString> </parameters> </component> </components> </castle> public class WindsorControllerFactory : DefaultControllerFactory { private WindsorContainer _container; public WindsorControllerFactory() { _container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle"))); List<Type> controllerTypes = new List<Type>(); foreach (Type t in Assembly.GetExecutingAssembly().GetTypes()) { if (typeof(IController).IsAssignableFrom(t)) controllerTypes.Add(t); } foreach (Type t in controllerTypes) { // LifestyleType.Transient = new controller instance for each request _container.AddComponentLifeStyle(t.FullName,t,LifestyleType.Transient); } } protected override IController GetControllerInstance(Type controllerType) { return (IController)_container.Resolve(controllerType); }
这一切都在我的C#代码很好,但是我想把我的提供者连接到MVC中以使用[Authorize]过滤器:
[Authorize (Users="user1,user2",Roles="role8")] public ViewResult MyResult(int x) { // implement }
我知道通常的方式告诉ASP.NET关于一个自定义的成员资格或角色提供程序是在web.config文件如下,但如果我这样做ASP.NET将尝试调用默认的构造函数,这将不起作用。任何帮助赞赏。
<membership> <providers> <clear/> <add name="MyMembershipProvider" type="MyMembershipProvider"> </providers> </membership>
解决方法
最简单的方法是使用ASP.NET的标准机制< membership>在web.config中。你只要让它使用默认的构造函数,但是你可以覆盖Initialize()并在其中拉取依赖项。使用
this作为参考。
就个人来说,由于这样的事情,我宁愿完全避免提供者的模式,所以我使用类似于described in the MonoRail docs的方法。嗯,它不那么blo肿,更灵活。最后,它只是设置HttpContext.User与正确的IPrincipal实现,这是AuthorizeAttribute使用的。
我最近blogged about a solution to do proper IoC with MembershipProviders。