【问题标题】:How to integrate IoC Membership provider with ASP.NET MVC如何将 IoC 成员资格提供程序与 ASP.NET MVC 集成
【发布时间】:2009-06-16 19:49:27
【问题描述】:

我有一个自定义成员资格/角色提供程序,我在我的 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-mvc dependency-injection asp.net-membership castle-windsor


    【解决方案1】:

    最简单的方法是在 web.config 中使用 ASP.NET 的 &lt;membership&gt; 标准机制。你只是让它使用默认的构造函数但是你覆盖了 Initialize() 和 pull 那里的依赖。使用this 作为参考。

    就个人而言,由于这样的事情,我更愿意完全避免提供者模型,所以我使用类似于 described in the MonoRail docs 的方法。恕我直言,它不那么臃肿而且更灵活。最后,只是将HttpContext.User 设置为正确的IPrincipal 实现,这就是AuthorizeAttribute 使用的。

    我最近blogged about a solution to do proper IoC with MembershipProviders

    【讨论】:

    • 谢谢。虽然您的第一种方法工作正常,但正如您所说,创建自定义 IPrincipal/IIdentity 类提供了更大的灵活性。例如,创建一些不同于 Forms Authentication 提供的用户/角色授权的捷径。
    • 看起来 webdotnet 项目目前正在将其存储库移动到 mercurial,链接已损坏:-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多