IOC 멤버십 제공 업체를 ASP.NET MVC와 통합하는 방법
-
05-07-2019 - |
문제
MVC 컨트롤러에 사용하는 맞춤형 멤버십/역할 제공 업체가있어 ASP.NET MVC에 액세스 할 수 있으므로 인증 필터 등을 사용할 수 있습니다. 많은 사람들이 맞춤형 제공 업체를 구현했기 때문에 많은 사람들이 한 적이 있다고 생각합니다. 이것은하지만이 문제를 구체적으로 해결하는 게시물을 찾거나 발견하지 못했습니다. 이 게시물 내 질문의 일종의 반대편입니다. 제 경우에는 내 커스텀 제공 업체가 컨트롤러와 잘 작동하고 있으며 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 (Users="user1, user2", Roles="role8")]
public ViewResult MyResult(int x) {
// implement
}
사용자 정의 멤버십 또는 역할 제공 업체에 대해 ASP.NET에 알리는 일반적인 방법은 아래와 같이 Web.config 파일에 있지만이 작업을 수행하면 기본 생성자를 호출하려고 시도합니다. 모든 도움이 감사합니다.
<membership>
<providers>
<clear/>
<add name="MyMembershipProvider" type="MyMembershipProvider">
</providers>
</membership>
해결책
이것을 작동시키는 가장 간단한 방법은 ASP.NET의 표준 메커니즘을 사용하는 것입니다. <membership>
web.config에서. 기본 생성자를 사용하게하십시오 하지만 초기화 () 및 당기다 거기에 의존성. 사용 이것 참조로.
개인적으로, 이와 같은 것들 때문에, 나는 제공자 모델을 완전히 피하는 것을 선호하므로 그것과 비슷한 접근법을 사용합니다. 모노레일 문서에 설명되어 있습니다. IMHO 덜 부풀어 오르고 유연합니다. 결국, 그것은 단지 설정에 관한 것입니다 httpcontext.user 적절한 iprincipal AwerizeatTribute가 사용하는 구현.