Asp.net WebApi의 사용자 지정 인증-엉망입니까?


113

WebApi의 인증에 대한 여러 리소스 (책 및 SO 답변)에서 읽고 있습니다.

특정 사용자에게만 액세스를 허용하는 사용자 정의 속성을 추가한다고 가정합니다.

사례 # 1

나는 무언가가 잘못되면 응답을 설정하는 재정의 접근 방식을 보았습니다. OnAuthorization

public class AllowOnlyCertainUsers : AuthorizeAttribute
{
 public override void OnAuthorization(HttpActionContext actionContext)
  {
   if ( /*check if user OK or not*/)
   {
     actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
   }
  }
}

사례 # 2

그러나 나는 또한 재정의 OnAuthorization하지만 다음을 호출 하는 유사한 예제를 보았습니다 base.

public override void OnAuthorization(HttpActionContext actionContext) 
{ 
  base.OnAuthorization(actionContext);

    // If not authorized at all, don't bother

    if (actionContext.Response == null)  
     {
      //...
     }
}

그런 다음 HttpActionContext.Response이 설정되어 있는지 확인합니다 . 설정되지 않은 경우 요청이 승인되고 사용자가 정상임을 의미합니다.

사례 # 3

하지만 재정의하는이 접근 방식도 보았습니다 IsAuthorized .

public class AllowOnlyCertainUsers : AuthorizeAttribute
{
 protected override bool IsAuthorized(HttpActionContext context)
  {
   if ( /*check if user OK or not*/)
   {
    return true;// or false
   }
  }
}

사례 # 4

그리고 비슷한 예제 1을 보았지만 base.IsAuthorized (context)를 호출했습니다.

protected override bool IsAuthorized(HttpActionContext context)
{
 if (something1 && something2 && base.IsAuthorized(context)) //??
 return true;
 return false;
}

하나 더

그리고 마침내 Dominick는 여기에서 말했습니다 .

OnAuthorization을 재정의하면 안됩니다. [AllowAnonymous] 처리가 누락 될 수 있기 때문입니다.

질문

  • 1) 내가 사용해야하는 방법 : IsAuthorizedOnAuthorization? (또는 사용시기)

  • 2) 언제 base.IsAuthorized orbase.OnAuthorization`을 호출 해야합니까?

  • 3) 이것이 그들이 그것을 만든 방법입니까? 응답이 null이면 모든 것이 정상입니까? (케이스 # 2)

NB

나는 AuthorizeAttribute이미 상속받은 것만 사용하고 있습니다 (사용하고 싶습니다)AuthorizationFilterAttribute

왜 ?

나는 첫 번째 단계에 있기 때문에 : http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api

여기에 이미지 설명 입력

어쨌든 확장 Authorize 속성을 통해 요청합니다.


Authorize 속성을 재정의하려면 무엇이 필요합니까? 달성하려는 사용 사례는 무엇입니까? 특정 사용자에 대한 액세스를 허용해야하는 경우 이와 같이 [Authorize (Users = "Admin")] 속성을 사용하지 않는 이유는 무엇입니까?
Taiseer Joudeh 2014 년

1
@TaiseerJoudeh 예를 들어 10:00에서 12:00까지 사용자에게 권한을 부여합니다 (구성 가능). 일반 역할과 권한 부여 된 속성으로는이를 수행 할 수 없습니다. 당신은 당신의 자신의 논리를 확인해야합니다
Royi Namir

답변:


93

어떤 방법을 사용해야합니까 : IsAuthorized 또는 OnAuthorization? (또는 사용시기)

AuthorizationFilterAttribute권한 부여 논리가 설정된 ID 및 역할에 의존하지 않는 경우 확장 합니다. 사용자 관련 인증의 경우 AuthorizeAttribute. 전자의 경우 OnAuthorization. 후자의 경우 IsAuthorized. 이러한 속성의 소스 코드에서 볼 OnAuthorization수 있듯이은에서 파생 된 경우 재정의 할 수 있도록 가상으로 표시됩니다 AuthorizationFilterAttribute. 반면에 IsAuthorized메서드는 AuthorizeAttribute. 나는 이것이 의도 된 사용법에 대한 좋은 포인터라고 생각합니다.

언제 base.IsAuthorized 또는 base.OnAuthorization을 호출해야합니까?

이 질문에 대한 답은 OO가 일반적으로 어떻게 작동하는지에 있습니다. 메서드를 재정의하면 새 구현을 완전히 제공하거나 부모가 제공 한 구현에 피기 백하여 동작을 향상시킬 수 있습니다. 예를 들어 IsAuthorized(HttpActionContext). 기본 클래스 동작은 설정된 ID와 필터에 지정된 내용에 대해 사용자 / 역할을 확인하는 것입니다. 이 모든 작업을 수행하고 싶지만 추가로 요청 헤더 또는 무언가를 기반으로 할 수있는 다른 항목을 확인하고 싶습니다. 이 경우 이와 같은 재정의를 제공 할 수 있습니다.

protected override bool IsAuthorized(HttpActionContext actionContext)
{
    bool isAuthroized = base.IsAuthorized(actionContext);
    // Here you look at the header and do your additional stuff based on actionContext
    // and store the result in isRequestHeaderOk
    // Then, you can combine the results
    // return isAuthorized && isRequestHeaderOk;
}

죄송합니다. Q3을 이해하지 못합니다. BTW, Authorization filter는 오랫동안 사용되어 왔으며 사람들은 모든 종류의 일에 때로는 잘못 사용하기도합니다.

하나 더. 그리고 마지막으로 여기에 다음과 같은 사람이 있습니다. OnAuthorization을 재정의해서는 안됩니다. [AllowAnonymous] 처리가 누락되기 때문입니다.

액세스 제어의 신이라고 말한 사람-Dominick. 분명히 정확할 것입니다. OnAuthorization(아래 복사) 의 구현을 보면 ,

public override void OnAuthorization(HttpActionContext actionContext)
{
    if (actionContext == null)
    {
        throw Error.ArgumentNull("actionContext");
    }

    if (SkipAuthorization(actionContext))
    {
        return;
    }

    if (!IsAuthorized(actionContext))
    {
        HandleUnauthorizedRequest(actionContext);
    }
}

에 대한 호출 SkipAuthorizationAllowAnonymous필터가 적용 되었는지 확인하는 부분입니다 . 즉, 권한 부여를 건너 뜁니다. 이 메서드를 재정의하면 해당 동작을 잃게됩니다. 실제로 사용자 / 역할을 기반으로 권한을 부여하기로 결정했다면 그 시점에서에서 파생하기로 결정했을 것입니다 AuthorizeAttribute. 그 시점에서 당신에게 남은 올바른 옵션 은 기술적으로도 가능하지만 IsAuthorized이미 재정의 된 것이 아니라 재정의 OnAuthorization하는 것입니다.

추신. ASP.NET Web API에는 인증 필터라는 또 다른 필터가 있습니다. 아이디어는 이름에서 알 수 있듯이 인증 및 권한 부여 필터에 사용하는 것입니다. 그러나이 경계가 퍼지는 사례가 많이 있습니다. 많은 인증 필터 예제가 일종의 인증을 수행합니다. 어쨌든 시간이 있고 조금 더 이해하고 싶다면 MSDN 기사를 참조하십시오 . 면책 조항 : 저에 의해 작성되었습니다.


다시 한 번 감사드립니다.하지만 행 사이를 읽으면 IsAuthenticated는 OnAuthirization에 의한 호출이므로 OnAuthorization을 재정의하고 base.OnAuthorization을 호출 한 다음 응답을 확인하지 않는 이유는 무엇입니까?
Royi Namir 2014 년

그것이 당신이 원하는 것이라면 확실히 할 수 있습니다.
Badri

내 세 번째 질문에서 내가 의미하는 것은 : 예를 들어 base function-base.OnAuthorization을 실행 한 후 성공했는지 확인하는 유일한 방법은 Response 속성을 검사하는 것입니까? ps 예제는 귀하의 책에서 가져온 것입니다 :-)
Royi Namir

예, 일반적으로 내가 아는 한 401 상태 코드를 찾지 만 null이 아닙니다. BTW, 나는 OnAuthorization내 책에서 재정의 에 대해 쓴 기억이 없습니다 . 나는 null에 대한 응답을 확인하는 것에 대해 작성하지 않았을 것이라고 확신합니다. coz에 대해 처음 들었습니다.)
Badri

네, 다른 책과 헷갈 렸어요. 저는 securty (yours), actual (yours), webapi pro (Tugberk 's, Zeitler, Ali)의 3 권을 동시에 읽고 있습니다. 보시다시피 -그들은 거기에서 그것을했습니다 : i.stack.imgur.com/LNGi4.jpg- 그들은 단지 null인지 확인 했으므로 null 또는 오류 코드를 확인해야합니까?
Royi Namir 2014 년

18

좋아, 내 제안은 웹 API를 보호하기 위해 OAuth 전달자 토큰을 사용하고 토큰을 발행 할 때 사용자에 대한 클레임으로 allowedTime을 설정한다고 가정하고 다음을 수행하는 것입니다. 여기에서 토큰 기반 인증 에 대해 자세히 읽을 수 있습니다.

  1. AuthorizationFilterAttribute에서 파생되는 CustomAuthorizeAttribute 만들기
  2. 메서드를 재정의 OnAuthorizationAsync하고 아래 샘플 코드를 사용하십시오.

     public class CustomAuthorizeAttribute : AuthorizationFilterAttribute
    {
    
        public override Task OnAuthorizationAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
        {
    
            var principal = actionContext.RequestContext.Principal as ClaimsPrincipal;
    
            if (!principal.Identity.IsAuthenticated)
            {
                return Task.FromResult<object>(null);
            }
    
            var userName = principal.FindFirst(ClaimTypes.Name).Value;
            var userAllowedTime = principal.FindFirst("userAllowedTime").Value;
    
            if (currentTime != userAllowedTime)
            {
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, "Not allowed to access...bla bla");
                return Task.FromResult<object>(null);
            }
    
            //User is Authorized, complete execution
            return Task.FromResult<object>(null);
    
        }
    }
  3. 이제 컨트롤러에서 CustomAuthorize 속성을 사용하여이 권한 부여 논리를 사용하여 컨트롤러를 보호합니다.

1
감사. 하지만 현재 사용하고 AuthorizeAttribute상속 않는 AuthorizationFilterAttribute... 내가 특별히 내가 사용해야하는 방법에 대한 및 응답 콘텐츠가에 대한 여부 꼬추 물어 학습 - 또한 및
Royi Namir

3

ASP.NET v5 완전히 새로운 권한 부여 시스템을 도입했습니다. .NET 5를 사용하려는 사람들에게는 Microsoft.AspNet.Authorization으로 이동하는 것이 좋습니다.

둘 다 유지함으로써 발생하는 혼란을 거의 마무리합니다. System.Web.Http.AuthorizeSystem.Web.Mvc.Authorize기타 이전의 인증 구현을.

작업 유형 (만들기, 읽기, 업데이트, 삭제), 리소스, 역할, 클레임,보기, 사용자 지정 요구 사항의 매우 좋은 추상화를 제공하며 위의 항목을 결합하여 사용자 지정 처리기를 만들 수 있습니다. 또한 이러한 핸들러를 조합하여 사용할 수도 있습니다.

ASP.NET v5에서 권한 부여는 이제 간단한 선언적 역할과 더 풍부한 정책 기반 모델을 제공합니다. 여기서 권한 부여는 요구 사항에 표현되고 처리기는 요구 사항에 대해 사용자 클레임을 평가합니다. 명령형 검사는 사용자가 액세스하려는 리소스의 사용자 ID와 속성을 모두 평가하는 간단한 정책 또는 정책을 기반으로 할 수 있습니다.


14
알아두면 좋지만 질문에 전혀 대답하지 않습니다.
Zero3
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.