質問

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>
役に立ちましたか?

解決

これを機能させる最も簡単な方法は、web.configでASP.NETの<membership>の標準メカニズムを使用することです。デフォルトのコンストラクタを使用するようにしますが、 Initialize()をオーバーライドし、そこで依存関係をプルします。 this を使用します参照として。

個人的には、このようなことが原因で、プロバイダーモデルを完全に回避することを好むため、 MonoRailドキュメントに記載。私見では、肥大化が少なく柔軟です。最終的には、 HttpContext.User 適切な IPrincipal 実装であるAuthorizeAttributeが使用するもの。

最近 MembershipProvidersで適切なIoCを実行するソリューションについてブログに投稿しました

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top