문제

ASP.NET MVC 앱이 있고이 앱 (UI)은 BLL (Business Logic Layer)을 참조하고 BLL은 내 데이터 액세스 계층 (DAL)을 참조합니다.

권한 부여를 위해 맞춤형 멤버십 및 역할 제공 업체를 활용하고 있습니다.

멤버십 제공 업체를 참조하는 데 필요한 계층을 결정하려고합니다.

MVC에서는 다음과 같은 방식으로 승인 검사를 수행 할 수 있습니다.

[Authorize(Roles = "SomeRoleName")]
public ActionResult Index()
{
//do something
}

그리고 내 BLL에서 사용자가 역할을하는지 확인하고 싶을 수도 있습니다.

public static bool IsRoleEditor(User user, Role userRole)
  {
   bool retValue = false;

   if (user.Application.AppID == UserRole.Application.AppID)
   {
        if (Roles.IsUserInRole("ModifyRoles"))
        {
           retValue = true;
        }


    return retValue;
   }

이 작업을 수행하면 두 계층의 멤버십 클래스를 참조하고 인스턴스화해야합니다. 이것이 이와 같은 앱을 건축하는 올바른 방법입니까? 중복성이 많은 것 같습니다.

BLL이 있으므로 [roodize (rolize (realize ="someroleName ")]속성을 사용하지 말고 대신 MVC 코드 내에서 BLL 기능을 호출하여 사용자가 역할을 수행하는지 확인하십시오. 이 작업을 수행하면 MVC는 여전히 인증을 위해 멤버십 제공 업체에 대한 참조가 필요하며 어쨌든 로그인 및 기타 ASP 컨트롤을 활용할 수있는 어쨌든?

나는 기지에서 벗어나 잘못된 방향으로 향하고 있습니까?

도움이 되었습니까?

해결책

제 생각에 이것은 멤버십/역할 설계의 약점입니다.

예를 들어 분산 N-Tier 앱에서 UI 및 BLL 계층 모두에 대한 역할 기반 승인을받는 것과 같은 방법은 관련 비트 (GetrolsforUser 등) 및 관련 비트 (GetRolsforUser 등)를 노출시키는 BLL 계층에 서비스를 노출시키는 것입니다. 서버에서 RoleProvider를 호출하여 구현됩니다.

그런 다음 BLL에서 노출 된 서비스를 호출하여 구현 된 클라이언트에서 사용자 정의 RoleProvider를 구현하십시오.

이런 식으로 UI 계층 및 BLL 계층은 모두 동일한 롤레프 로이더를 공유합니다. UI 계층은 현재 사용자의 역할에 대한 지식을 사용하여 UI를 개선 할 수 있으며 (예 : 무단 기능에 해당하는 UI 컨트롤을 숨기기/비활성화 함) BLL은 사용자가 승인되지 않은 비즈니스 로직을 실행할 수 없도록 할 수 있습니다.

다른 팁

훌륭한 질문, 나는 오늘 나 자신에게 같은 것을 물었다. 내가 가진 아이디어 중 하나 (그러나 그것이 가장 좋은 방법인지 확실하지 않음)는 액세스를 테스트하기 위해 BLL로 전달할 수있는 인터페이스 (예 : iroleprovider)를 사용하는 것입니다.

public static bool IsRoleEditor(User user, IRoleProvider rp)
{
     return (rp.IsUserInRole(user,"ModifyRoles"));
}

이를 통해 여전히 BLL에서 액세스를 확인하고, 단위 테스트에서 모의를 사용하여 논리를 확인할 수 있으며, 구현할 MVC 웹 사이트에서 클래스를 만들거나 (베이스 컨트롤러 클래스에서이를 구현) 만 구현하면됩니다. Iroleprovider 및 ASP.NET Authorization API를 사용하여 올바른 점검을 수행하십시오.

이것이 도움이되기를 바랍니다.

사용자 개체를 가져와 IPRINCIPAL 인터페이스를 구현하고 레이어 주위에 던지십시오. 그런 다음 내장 된 [Autorize] 속성을 사용할 수 있습니다.

3 년 전에 쓰여진 Athough와 Castle, 이 기사 도움이 될 수 있습니다. 그것은 Iprincipal 물건에 반쯤 내려 가기 시작합니다.

hths
찰스

회원 자격에 의존하지 않도록 역할을 BLL에 전달하지 않겠습니까? 또는 Martinb가 제안한 것처럼 인터페이스를 사용하십시오.

스테이크 보유자 (들)가 다른 형태의 인증을 가지고 가기로 결정하고 더 이상 역할 물체?

예시:

IsRoleEditor(User user, string[] roles)
{
  return roles.Contains("ModifyRoles");
}

MVC의 요점을 놓치지 않습니까? MVC는 자연스러운 계층으로 나뉩니다. 모델 (dal), 컨트롤러 (BLL),보기 (프레젠테이션). 원하는 경우 다른 프로젝트로 갈 수 있지만 컨트롤러에는 모든 비즈니스 논리가 있으므로 RoleProvider에만 액세스하면됩니다.

그런 다음 리포지토리, 패턴 등과 같은 패턴을 적용하여 원하는 경우 더 분할됩니다.

데이비

MVC 컨트롤러 'UI'를 호출하는 것은 마크에서 벗어납니다. MVC의 'C'는 부분 클래스를 참조하더라도 BLL의 BLL을 호출 할 것입니다. 그러나 그것은 당신의 질문의 요점이 아닙니다.

" 'UI'앱과 'BLL'을 100% 분리 해야하는 실제 요구 사항이 있습니까?"라는 질문을 함으로써이 문제를 해결할 것이라고 생각합니다. 두 구성 요소 모두 회원/역할 공급자에 대한 종속성을 공유하면 그렇게하고 작업을 시작하십시오.

BLL을 플러그로 뽑고 새 제품을 연결하는 경우 .NET 제공 업체에 대한 공유 종속성을 갖는 것이 당신이 함께 살 수있는 것입니다. 당신은 그것이 괜찮다는 것을 알고 있습니다. 그리고 당신의 앱은 분리되지 않을 수 있습니다.

위의 Joe의 대답은 의미가 있다고 생각합니다 ...

나는 당신이하는 일이 괜찮다고 생각합니다.

승인 및 인증은 서비스 계층 내에 있어야하며 아마도 컨트롤러로 전달됩니다.

컨트롤러가 주요 및 ID를 설정 한 다음 MVC 속성을 사용하여 컨트롤러에서이를 사용하면 좋은 아이디어처럼 들립니다.

MVC 멤버십 제공 업체를 인터페이스 뒤에 숨기는 것이 좋을 것입니다. 예를 들어 WinForms 멤버십 제공 업체 (예 :)를 교체 할 수 있으며 컨트롤러를 테스트 할 수 있습니다.

역할 액세스는 일반적으로 BLL에 있어서는 안됩니다. 액세스는 사용자 인터페이스 책임입니다.

그렇게 말하면 위의 포스터가 언급 한 바와 같이 iprinciple 인터페이스를 활용하십시오. 스레드 레벨에서 iprinciple에 액세스 할 수 있습니다.

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