IoCメンバーシッププロバイダーをASP.NET MVCと統合する方法
-
05-07-2019 - |
質問
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 を設定するだけです。 a>適切な IPrincipal 実装であるAuthorizeAttributeが使用するもの。