18

MVC 컨트롤러에서 사용하는 사용자 지정 멤버 자격/역할 공급자가있어서 ASP.NET MVC에 액세스 할 수 있기 때문에 AuthorizationFilters 등을 사용할 수 있습니다. 많은 사람들이 사용자 정의 공급자를 구현 한 이래로 많은 사람들이이 작업을 수행했다고 상상하지만이 문제를 구체적으로 설명하지는 못했습니다. This post는 제 질문의 플립 측면입니다. 제 경우에는 컨트롤러와 잘 작동하는 커스텀 공급자가 있고, MVC도 그것을 사용하기를 원합니다.IoC 멤버 자격 공급자를 ASP.NET MVC와 통합하는 방법

내 공급자는 IoC/종속성 주입 디자인으로 구현됩니다. 공급자는 기본 멤버 자격/역할 API 이상의 추가 기능을 제공합니다. 내 컨트롤러에서는 Castle Windsor를 사용하여 인스턴스를 만듭니다. 이 모든 내 C# 코드에서 잘 작동

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); 
    } 

하지만 난 그것으로 필터를 사용하여 [권한 부여]로 MVC에 내 업체를 연결하려면 : 코드는 비슷한에 보이는

[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> 

답변

24

작업이를 얻을 수있는 가장 간단한 방법은 Web.config의에서 <membership>의 ASP.NET의 표준 메커니즘을 사용하는 것입니다. 방금 기본 생성자 을 사용하게하고을 사용하면 Initialize()를 재정의하고 에 종속시킵니다. 참고로 this을 사용하십시오.

개인적으로 이와 같은 이유로 공급자 모델을 피하는 것이 더 좋기 때문에 described in the MonoRail docs과 비슷한 방식을 사용합니다. IMHO 덜 부풀고 유연합니다. 결국, AuthorizeAttribute가 사용하는 적절한 IPrincipal 구현으로 HttpContext.User을 설정하는 것입니다.

나는 최근 blogged about a solution to do proper IoC with MembershipProviders입니다.

+1

감사합니다. 귀하의 첫 번째 방법은 잘 작동하지만 사용자 정의 IPrincipal/IIdentity 클래스를 작성하면 유연성이 향상됩니다. 예를 들어, Forms 인증이 제공하는 것과 다른 종류의 사용자/역할 인증을 작성하는 짧은 경로입니다. – keithm

+2

webdotnet 프로젝트가 현재 저장소를 수은으로 옮기고있는 것 같습니다. 링크는 깨졌습니다 .--( –

+0

webdotnet project up :-) –