0

나는 android mobile에서 오는 데이터를 소비하는 웹 API를 가지고 있습니다. 이 웹 API는 웹 API 요청과 함께 양식 데이터와 함께 여러 부분 파일을 사용합니다. 나는 아카이브에 this 기사를 따라 갔다.웹 API 2 용 사용자 정의 비동기 작업 필터

[CustAuthAsync] 
public async Task<HttpResponseMessage> SaveEHSInspectionData() 
    {   
     try 
     {    
      string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
      MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(root); 
      //do stuff 
      var res = await Request.Content.ReadAsMultipartAsync(provider); 
      // DO SOME STUFF 
     } 
     catch (Exception exp) 
     { 

     } 
     return Request.CreateResponse(HttpStatusCode.OK, result); 
    } 

이 웹 API에 대한 사용자 지정 액세스 유효성 검사를 수행하려고 했으므로 요청을 확인하는 필터가 구현되었습니다. 유효성 검사를 통과하면 수 있습니다 :

나는

public class CustAuthAsyncAttribute : ActionFilterAttribute 
{ 
    public override async Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken) 
    {    
     InternalOnExecutingAsync(actionContext); 
    } 
} 

이하이

protected void InternalOnExecutingAsync(HttpActionContext actionContext) 
     { 
      var authValue = actionContext.Request.Headers; 

if (authValue.Contains("CustomAccessToken")) 
      {     
       string token = authValue.GetValues("CustomAccessToken").First(); 

       var result = // doing some decription 

       if (result != null) 
       {      
        bool validationResult = // validation with database 
        if (!validationResult) 
        {       
         actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) 
         { ReasonPhrase = "Invalid token" }; 
        }      
       } 
       else 
       { 
        actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) 
        { ReasonPhrase = "Invalid token" }; 
       } 
      } 
      else 
      { 
       actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) 
       { ReasonPhrase = "Unauthorized Request" };     
      } 

이러한 구현과 같은 내부 방법은 API 클라이언트 도구 (우체부 예)에서 잘 작동하는 등의 필터가 있습니다 메소드에 요청하십시오.

Postman Response screen shot

무단 액세스로 응답 메시지를 말하고, 모바일 앱에서 작동하지 않습니다. 사용자 지정 액세스 유효성 검사가 통과되는 경우에도 메서드에 요청을 허용하지 않습니다.

참고 :이 방법은 필터를 사용하지 않고 모바일에서 나를 이것은 또한 모바일 앱에서 작동 얻을

도움말을 잘 노력하고 있습니다.

미리 감사드립니다.

답변

0

액세스를 관리하기 위해 잘못된 유형의 필터를 사용하고 있습니다. 인증 필터를 사용해야합니다. 게다가 비동기 인증 방법을 사용할 수 없습니다. 호출 클라이언트가 정리를 기다려야합니다. 이것은 겪고있는 부작용을 일으킬 수 있습니다.

모바일 응용 프로그램이라는 사실과 관련이있는 것은 확실하지 않지만 요청을 처리하기 전에 권한 부여 단계가 진행됩니다. 프로젝트에서 다른 승인 양식을 사용하고 있지 않은지 확인하십시오.

당신은 AuthorizeAttribute 및 오버라이드 (override) IsAuthorized(HttpActionContext actionContext) 방법을 상속 권한 필터를 구현해야합니다 :

public class CustAuthAsync : AuthorizeAttribute 
{ 
    public CustAuthAsync() 
    { 
     ///Some initialization if required. Otherwise, not necessary to declare the constructor.. 
    } 

    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     var authValue = actionContext.Request.Headers; 

     if (authValue.Contains("CustomAccessToken")) 
     { 
      string token = authValue.GetValues("CustomAccessToken").First(); 

      var result = // doing some decription 

      if (result != null) 
      { 
       return //database validation 
      } 
      else 
      { 
       return false; 
       //No need to create special unauthorized response. You should not hint the reason at this point. You can do this in the HandleUnauthorizedRequest method. 
      } 
     } 
     else 
     { 
      return false;//No need to create special unauthorized response. 
     } 
    } 
} 

당신은 당신의 컨트롤러를 장식하는이 속성을 사용할 수 있습니다. 컨트롤러에 액세스하는 데 필요한 역할과 같이 액세스 관리에 대한보다 세부적인 제어를 위해 생성자에서 매개 변수를 전달할 수도 있습니다.