2009-10-30 4 views
0

일부 배경 시작합니다 MembershipService "인 경우이 서비스는 서비스 계층에서 IMembershipService 인터페이스를 구현합니다. 이 MemberShipService는 DAL를 조회하고 확인합니다 사용자 이름/암호Asp.net MVC 회원 디자인

를 기반으로 사용자를 나는 또한 사용자 지정 "AuthorizeOwnerAttribute"라는 AuthorizeAttribute을 만든 내가 설계 문제에 봉착 곳이다.

각 컨트롤러마다 서비스에 대한 의존성이 있습니다. 예. UsersController는 생성자에서 IUserService를 사용합니다.

현재 로그인 한 사용자와 편집중인 사용자가 동일한 "StudioId"인 ActionResult에서 AuthorizeAttribute를 호출하려면 어떻게해야합니까? 참고 : 나는 여러 컨트롤러로 AuthorizeAttribute를 사용하는

을뿐만 아니라 "UserController"를 원하는 그래서 내 질문은 :

  1. 나는 현재 인증 된 사용자의 "StudioId"저장하기 위해 무엇을해야으로 여러 컨트롤러에 걸쳐 에 사용됩니다.
  2. 요청이 클라이언트뿐 아니라 서비스 및 데이터 액세스 계층에서도 유효한지 확인해야하므로 서비스 계층에 대한 인증을 어떻게 내려야합니까?

기술 사용 (I 독립 실행 형 응용 프로그램에서 나중에 BLL 및 DAL을 다시 사용하려면이 적당하다, 난 그냥 클라이언트에서 그 유효성을 믿고있어에만 충분하다) : 를 - 을 통한 LINQ to SQL 리포지토리 패턴 - ASP.NET MVC 미리보기 2

모든 권장 사항 또는 코드 예제를 매우 환영합니다.

+0

그냥 약간의 설명을 ... System.Web.Security.MembershipProvider를 구현하고 있습니까? – zowens

+0

예, System.Web.Security.MembershipProvider –

답변

1

기본적으로 컨트롤러 수준에서 주로 내 보안을 이렇게 조정했습니다. 내가 사슬을 너무 멀리 아래로 통과시키지 않기로 결정했기 때문에 사람이 액세스 할 수 있는지 여부를 알아 냈습니다. 그렇지 않으면 IPrincipal.IsInRole()이이를 만족시킬 수 있는지를 확인했습니다.

이제 다소 힘든 일을했습니다. 나는 등록되었고이 조각이 그들에게 배정 된 사람들이이 섹션에서 그것을 액세스 할 수있는 유일한 사람들 이었음을 확인해야했다.

그래서 나는이 같은 훨씬 작동하는 속성 필터를 생성 :

[AuthFilter(ThingToView ="thingToView", Registration="registration") 
public ActionResult Method(Thing thingToView, Registration registration) 
{ 
.... 
} 
:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var thingToView = filterContext.ActionParameters[_thingToView] as thingToView ; 
      var registration = filterContext.ActionParameters[_registration] as Registration; 


      if (!registration.CanSeeThing(thingToView)) 
      { 
       throw new RegistrationCannotViewThing(registration, thingToView); 
      } 

      base.OnActionExecuting(filterContext); 
     } 

이제이 구현 다소 해키을 느낀 것은 내가 내 컨트롤러 방법에 이런 짓을한다는 것입니다

실제 매개 변수 지정이 모델 바인더에서 발생했습니다. 보안은 메서드에 전달 된 매개 변수를 확인하는 필터를 통해 발생합니다. 나는 많은 곳에서이 필터를 재사용했다.

저는 Scott Hanselman 게시물의 모델 바인더와 비슷한 것을했습니다 : http://www.hanselman.com/blog/IPrincipalUserModelBinderInASPNETMVCForEasierTesting.aspx 어떤 사용자가 메서드를 호출하는지 전달합니다.

위의 예제 블로그 게시물을 사용하여 사용자 개체를 컨트롤러 메서드로 가져와 서비스 계층에 전달할 수 있다고 가정합니다.

+0

이렇게하는 더 깨끗한 SOC 방법이 있어야합니까? 이것은 나를위한 최후의 수단입니다. 귀하의 의견을 주셔서 감사합니다. –

+0

게시물을 다시 읽으면 맞춤 ID를 저장할 수 있습니다. asp.net 응용 프로그램에서 IPrincipal을 설정하기 위해 찾을 수있는 많은 자습서가 있습니다. 인증을 통과하려면 서비스 계층에 IPrincipal을 수동으로 전달하거나 일부 AOP 기술을 사용할 수 있습니다. MVC에서 사용할 수있는 것을 고수하려고했습니다. AOP는 .NET에서 널리 사용되지 않습니다 (또는 적어도 그렇게 생각하지는 않습니다). – Min