문제

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가 사용하는 구현.

나는 최근에 멤버십 전문가와 적절한 IOC를 수행하기위한 솔루션에 대한 블로그.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top