2013-10-22 5 views
2

.NET WebAPI에서 컨트롤러 전체에 분산되지 않고 중앙 위치에 모든 권한 부여 규칙을 포함하는 방법을 만들었습니다. 이 중앙 집중화가 더 자주 수행되지 않는 이유가 궁금합니다. 반향/보안 문제가 있습니까?.NET WebAPI 중앙 인증

내 현재 접근법은 모든 권한 부여 데이터를 포함하는 DelegatingHandler를 사용하여 (아래 코드) 사전을 작성하여 App_Start 중에 작성하는 것입니다. 사전 키는 컨트롤러 및 작업의 튜플이며 값은 권한있는 역할입니다. DelegatingHandler는 WebAPI의 라우팅 구성을 연결하여 호출 된 컨트롤러를 가져온 다음 사전을 사용하여 요청이 허용되는지 여부를 결정합니다.

사전 :

var authorizations = new Dictionary<Tuple<string, string>, string>(); 
authorizations.Add(new Tuple<string, string>("values", "get"), "public"); 
authorizations.Add(new Tuple<string, string>("values", "put"), "private"); 

DelegatingHandler : 요약

public class SecurityDelegateHandler : DelegatingHandler 
{ 
    private readonly Dictionary<Tuple<string, string>, string> _authorizations; 

    public SecurityDelegateHandler(Dictionary<Tuple<string, string>, string> auth) 
    { 
     _authorizations = auth; 
    } 

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var config = GlobalConfiguration.Configuration; 
     var controllerSelector = new DefaultHttpControllerSelector(config); 
     var descriptor = controllerSelector.SelectController(request); 

     string restrictions; 

     if (!_authorizations.TryGetValue(
       new Tuple<string, string>(descriptor.ControllerName.ToLower(), 
       request.Method.ToString().ToLower()), out restrictions)) 
     { 
      return Task<HttpResponseMessage>.Factory.StartNew(() => 
         request.CreateResponse(HttpStatusCode.Forbidden, 
         "Access denied on unconfigured actions"), 
         cancellationToken); 
     } 

     if (!(Roles.Provider).GetRolesForUser(
       HttpContext.Current.User.Identity.Name).Any(r => 
       restrictions.Contains(r))) 
     { 
      return Task<HttpResponseMessage>.Factory.StartNew(() => 
         request.CreateResponse(HttpStatusCode.Forbidden, 
         "Access Denied"), cancellationToken); 
     } 

     return base.SendAsync(request, cancellationToken); 
    } 
} 

, 내 질문은 다음과 같습니다

  • 이 역할 기반 인증 구현에 문제가 있습니까 방법?
  • WebAPI의 중앙 집중식 인증을 처리하는 좋은 패키지가 있습니까? FluentSecurity, but that doesn't appear to support WebAPI에 대해 살펴 보았습니다.

감사합니다.

+0

사용자 정의 AuthorizeFilter를 전역으로 등록하는 것은 어떻습니까? –

+0

글로벌 필터를 사용하면 DelegatingHandler가 필요하지 않습니다. 중앙 집중식 인증을 사용하는 데 문제가 있는지 여부는 여전히 문제가됩니다. –

+0

귀하의 필요에 맞는 것이라면 어떤 문제도 보이지 않습니다. 여러 권한 부여 필터는 다른 컨트롤러 또는 작업에 대해 다른 규칙이있는 경우 유용하지만 항상 동일한 프로세스라면 더 효율적으로 중앙 집중화해야합니다. –

답변

2

귀하의 접근 방법이 좋습니다. 우려를 분리해야합니다. 이는 비즈니스 로직을 비 기능적 로직/요구 사항 (예 : 로깅, 인증 및 물론 권한 부여)과 분리하는 것을 의미합니다.

이것이 더 광범위하게 수행되지 않은 이유는 인증 또는 로깅을 외부화하는 것이 비즈니스와 관련이있는 권한을 외부화하는 것보다 훨씬 쉽기 때문입니다.

다른 프로그래밍 프레임 워크는 오늘날 외부화 된 권한 부여를 제공합니다. Microsoft는 클레임 ​​기반 권한 부여를 가지고 있으며, Java에는 몇 가지 프레임 워크가 있습니다. Spring Security, SunXACML ... PHP에는 Yii가 있습니다. Ruby에는 CanCan이 있습니다 ... 이러한 프레임 워크를 사용하면 역할 기반 액세스 제어 및 속성 기반 액세스 제어를 구현할 수 있습니다. 당신은 기술 중립적 인 솔루션, 즉 무언가를 원하는 경우에 ABAC

사용할 수

  • NIST RBAC
  • NIST :이 용어에 익숙하지 않은 경우, NIST의 웹 페이지를 체크 아웃 Java, .NET, PHP ... 확장형 액세스 제어 마크 업 언어 인 XACML을 사용할 수 있습니다. SAML과 마찬가지로 OASIS 표준입니다 (SAML은 연합 ID 및 SSO에 초점을 맞추고 XACML은 세부적인 권한 부여에 초점을 둡니다). OASIS 웹 사이트 및 Wikipedia 페이지에서 XACML에 대한 자세한 내용을 볼 수 있습니다. 외부화 권한 외에도 XACML은 매우 확장 가능한 접근 방식을 만드는 권한 부여에 대한 정책 기반 접근 방식을 정의합니다.

    XACML과 함께 제공 업체 (예 : Axiomatics)와 같은 몇 가지 오픈 소스 옵션 (JBoss, SunXACML, OpenAM ...)이 있습니다.

    HTH

+0

XACML은 정책을 설명하는 것 같지만 실제로는 * 적용해야합니다. 요즘, 그게 가장 가능성이 높습니다 [OAuth] (http://oauth.net/) [잘 지원되는 것] (http://stackoverflow.com/a/21858612/268066) .NET에서 (뿐만 아니라 다른 많은 플랫폼과 마찬가지로). 그리고 OAuth는 XACML을 필요로하지 않습니다. 두 개는 직교합니다. – CrazyPyro