2009-08-17 2 views
3

API 설정이 있습니다. 사용자가 잘못되었거나 누락 된 API 키를 제공하면 Response.StatusCode를 401로 설정하려고 시도합니다. 로그인 페이지로 수신 거부 될 수 있습니다. 그것은 API입니다 ... 그래서 나는 그것을 원하지 않습니다. 나는이 샘플 API에 대한 401ASP.NET HTTP-StatusCode를 401으로 하드 코드하면 로그인 페이지로 계속 이동합니까?

URL 인 코드로 그들에게 JSON 오류 메시지를 전송 할 수 있습니다 : /api/search/foo?apikey=12345&bar=hi+stack+overflow

내가 뭘 잘못 했나?

여기에 몇 가지 예제 코드는 다음과 같습니다 - 또한

// Do we have an Api Key that is legit? 
if (!CheckAPIKey(context)) 
{ 
    json = JsonConvert.ExportToString("Invalid API key or no API key was provided."); 
    context.Response.StatusCode = 401; // Not authorised. 
} 
else 
{ 
    ... get json data ... 
} 

context.Response.Write(json); 

, 내가 내 Web.config의에서 다음과 같은 한이 도움이된다면 ...

<authentication mode="Forms"> 
    <forms loginUrl="~/Pages/Login.aspx" protection="Validation" timeout="1000000000" requireSSL="false" slidingExpiration="true" defaultUrl="Default.aspx"> 
    </forms> 
</authentication> 

어떤 아이디어?

+0

가 날인가, 또는 401로 상태 코드를 설정하는

코드는 무언가 같이된다? –

+0

401 - 맞습니다. 나는 나의 포스트를 새롭게 할 것이다. 404 페이지를 찾을 수 없습니다. 두뇌는 일의 끝에 퇴색한다. –

답변

1

ASP.NET은 "401 Not authorized"상태를 처리하고 로그인 페이지로 사용자를 반송하기 때문에 서버에서 401 메시지를 처리하는 방식입니다.

"403 Forbidden"으로 설정하는 대신 ASP.NET을 로그인 처리기로 보내는 경향이 있지만 (실제로는 약간의 고통) 또는 "보통 400 Bad 요청 "

+0

"403 금지됨 - 인증이 도움이되지 않으며 요청을 반복해서는 안됩니다 - 서버가이 정보를 클라이언트에 제공하지 않으려면 상태 코드 404 (찾을 수 없음)를 대신 사용할 수 있습니다." http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html – jholster

0

이 동작은 사용하고있는 System.Web.Security.FormsAuthenticationModule에 따라 다릅니다 (그리고 올바르게 기억할 수 있으면 기본적으로 활성화되어 있습니다). AuthenticateRequest 이벤트뿐만 아니라 HTTP 코드 401을 찾는 EndRequest 이벤트도 모니터링합니다. 다른 모듈 (예 : System.Web.Security.UrlAuthorizationModule)이 "평가"신호를 보내는 방식입니다. 귀하의 URL이 API 인 경우

, 아마 당신은 Web.config의 미세 조정 구성에서

<location /> 

요소를 사용할 수 있습니다. HTH

편집 : 뭔가 더 ...

나는 나의 제안 어쩌면 Zhaph - Ben Duguid의 생각이 더 :-) 도움이 될 모르겠어요. 어쨌든

... 여기

location Element위한 기준이다. 즉, 특정 경로에 대해 다른 구성 집합을 결정할 수 있습니다. 완전히 동등하지 않은 또 다른 방법이 있습니다. hierarchical .config 파일의 특성 활용. 나는 당신의 API가 더 큰 웹 응용 프로그램의 일부인 것으로 가정

... 당신의 경우

경우 (귀하의 예제에서)이 URL/API/검색/foo에 대한, 평가해야합니다, 당신은 다른 원하는 행동. 다른 것이 필요한 경우 "위치"에 대한 참조를보고 무언가를 끌 수 있는지 알아보십시오.

응용 프로그램이 "그냥"API 인 경우 필요하지 않은 모듈 (특히 리디렉션을 담당하는 FormsAuthenticationModule)을 모두 제거 할 수 있습니다.

+0

안녕하세요 Fabrizio ...이 구성 요소에 대해 자세히 설명해주세요. 그것은 무엇을합니까? –

+0

좋아, 나는 뭔가를 추가했지만 ... 나는 Zhaph의 해결책이 더 좋다고 생각한다. ;-) –

3

Globals.asax의 Application_EndRequest에서 401을 처리하도록하십시오. 폼 인증 모드를 설정하면 401 상태 코드의 Login.aspx 페이지로 리디렉션됩니다.

HttpContext context = HttpContext.Current; 
// Do we have an Api Key that is legit? 
if (!CheckAPIKey(context)) 
{ 
    context.Response.StatusCode = 401; // Not authorised. 
} 
else 
{ 
    ... get json data ... 
} 
context.Response.Write(json); 

그리고 같은의 Application_EndRequest 뭔가에

:

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    HttpContext context = HttpContext.Current; 
    if (Response.StatusCode == 401) 
    { 
     Response.ClearContent(); 
     json = JsonConvert.ExportToString("Invalid API key or no API key was provided."); 
     context.Response.Write(json); 
    } 
} 
관련 문제