2017-11-05 4 views
2

내 목표는 현재 로그온 한 사용자의 customerId가 url/controller의 customerId와 일치 할 경우에만 사용자를 인증하는 것입니다.url에 대한 사용자 로그인 허용

저는 ASP.NET Core 2.0을 엔티티 프레임 워크와 함께 사용하고 있습니다. ApplicationIser를 CustomerId int로 확장했으며 FK가 CustomerIdentity 테이블에 있습니다. 나는 고객 ID를 매개 변수가 내 컨트롤러에서 다음

routes.MapRoute(
      name: "customers", 
      template: "{customerId?}/{controller=Home}/{action=Index}/{id?}"); 

그리고 : 나는 라우팅을 한 http://rion.io/2016/01/04/accessing-identity-info-using-dependency-injection-in-net-5/

: 나는 여기에이 방법을 사용하여 로그인 한 사용자에서 고객 ID를 검색 할 수 있어요

.

글로벌 관리자는 원하는 고객 ID를 사용할 수있는 권한이 있지만 그 밖의 모든 사용자는 로그인 한 사용자의 고객 ID 만 사용할 수 있습니다.

나는 this 접근 방식을 사용하여 url에서 customerId를 확인하십시오./23/Computers/Approve matches currentCustomerId

그러나 정책에 적용하고 asp.net 핵심 사용 방법을 잘 모르겠습니다.

public class CustomerRequirement : IAuthorizationRequirement 
{ 
    public bool IsMatchingLoggedInUser { get; private set; } 

    public CustomerRequirement(bool isMatchingLoggedInUser) 
    { 
     IsMatchingLoggedInUser = IsMatchingLoggedInUser; 
    } 
} 

확실하지가 어떻게 하나를 만들기 위해 : 나는 SOFAR이 무엇

public class CustomerRequirementHandler : AuthorizationHandler<CustomerRequirement> 
{ 
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomerRequirement requirement) 
    { 
     //GetDate.CurrentCustomerId is a static int property set after user has logged in 
     if (GetData.CurrentCustomerId == /*Get httpContext customerId ??? "")*/ 42) 
     { 
      context.Succeed(requirement); 
     } 


     return Task.CompletedTask; 
    } 
} 

아니 나는 완전히 떨어져 왔어요하거나 다르게 할 수 있으면 있는지? 나는 제안을 위해 열려 있습니다.

업데이트 (내가 함께 결국 무엇을)

public class ValidateCustomerAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext context) 
     { 
      if (GetData.CurrentCustomerId != (int)context.ActionArguments["customerId"]) 
      { 
       context.Result = new UnauthorizedResult(); 
      } 
     } 
    } 

은 그럼 내 컨트롤러에서 나는이 속성으로 장식. 이 경우 관리자를 제외해야하지만 나중에 올 것입니다. (그리고 더 오류 처리 :) :)

답변

1

ASP.NET 코어가 (작업 필터와 유사한 AuthorizationHandler입니까?)이 작업을 수행하는 방법에 익숙하지 않지만 역할을 사용하여 처리 할 수있는 것처럼 보입니다.

사용자 정의 인증 논리를 여기에 넣은 사용자 정의 인증 조치 필터가 있습니다. 컨트롤러에서 로그인 한 사용자의 역할을 확인할 수 있습니다. 역할에 "Admin"이없고 고객 ID가 URL의 고객 ID와 일치하지 않으면 403을 반환하고 그렇지 않으면 정상적으로 계속하십시오.

고객 ID 값을 얻는 것이 문제이며 동작 매개 변수에 액세스 할 수없는 경우 현재 요청의 Uri를 사용하고 경로를 분할하여 그런 식으로 처리 할 수 ​​있습니다. 하지만 그것은 깨지기 쉬운 구현입니다.

+0

이것이 내 목표입니다. mvc5에서 사용자 지정 논리를 사용하여 사용자 지정 권한 부여 특성을 만들 수 있지만 여기서는 httpcontext 또는 기타 물건을 전달할 수없는 처리기를 사용해야합니다. 어쩌면 커스텀 핸들러가 어떻게 동작하는지에 대한 지식이 부족한 것일 수도 있습니다. –

+0

액션 필터가 코어에서 계속 사용할 수있는 것처럼 보이므로이 방법을 시도해 보겠습니다. 나는 또한 사용자 지정 라우팅 제약 조건을 만들려고했기 때문에 URL에있는 아이디는 관리자가 아닌 한 로그인 한 사용자에 속해야하지만 사용자가 로그온했는지 확인해야하기 때문에 복잡 할 수 있습니다. –

+0

좋아, 나는 actionfilters를 사용하고, 잘 작동합니다. 도움을 주셔서 감사합니다. 나는 내가 구현 한 것에 대해 질문을 편집했다. 자유롭게 의견을 말하십시오. –

관련 문제