如何将IoC Membership提供程序与ASP.NET MVC集成

18
我有一个自定义的会员/角色提供程序,我在我的MVC控制器中使用它,我也希望ASP.NET MVC可以访问它,这样我就可以使用AuthorizationFilters等功能。由于很多人都实现了自定义提供程序,我想很多人都已经做到了这一点,但我还没有找到解决这个问题的帖子或文章。这篇文章是我问题的反面。在我的情况下,我的自定义提供程序在我的控制器中正常工作,我希望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>
1个回答

24
最简单的方法是使用ASP.NET中web.config中<membership>的标准机制。您只需让它使用默认构造函数,但重写Initialize()并在那里提取依赖项。使用this作为参考。
个人而言,由于像这样的事情,我更喜欢完全避免提供程序模型,因此我使用类似于MonoRail文档描述的方法的方法。在我看来,它更少臃肿且更灵活。最终,只需使用适当的IPrincipal实现设置HttpContext.User,这就是AuthorizeAttribute使用的内容。
我最近发布了一篇关于如何使用MembershipProviders进行适当IoC的解决方案的博客文章

1
谢谢您。虽然您的第一种方法可以正常工作,但是像您所说的创建自定义的IPrincipal/IIdentity类提供了更多的灵活性。例如,可以很快地创建一些不同类型的用户/角色授权,而不仅仅是Forms身份验证提供的功能。 - keithm
2
看起来webdotnet项目正在将其存储库转移到mercurial,链接已经失效 :-( - Mauricio Scheffer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接