1

간단한 컨트롤러를 가진 MVC 3 REST API가 있습니다 : ApiController.JSON에 대한 Javascript 요청은 ASP.NET MVC 3에서 폼 인증을 사용합니다.

public class ApiController : Controller 
{ 
    [HttpPost] 
    public JsonResult Foo(string input) 
    { 
     ... 
    } 
} 

내가 어떤 사용자가 입력 한 데이터로 JQuery와 메소드 호출 푸를하고 결과를 표시 할하십시오 JSON 결과를 일부 문자열 정보를 받아 반환 ApiController의 방법 Foo이있다.

여기서 catch는 사용자가 Foo에 대한 액세스가 허용되는지 확인하고자하는 것입니다. ASP.NET MVC 3에서이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 그 대답은 SSL과 기본 인증을 사용하는 것이라고 생각하지만, 나는 그것이 어떻게 생겼는지 전혀 모른다. 또한, 내 자신의 암호 해싱/소금을 굴려야 만합니까 또는 폼 인증을 사용하는 몇 가지 방법이 있습니까?

편집 : 제 3의 개발자가 사용할 수있는 API를 만들려고합니다. 예를 들어 Gmail을 검색하고 텍스트를 Foo로 보내고 브라우저에 표시하는 Rapportive 스타일 브라우저 플러그인을 작성하는 경우

또한 양식 인증을 사용하면 일반 텍스트로 사용자 이름/암호 정보가 전송 될 것입니다. 이 문제를 방지하기 위해 SSL을 구현하는 방법을 잘 모르겠습니다.

답변

2

FormsAuthentication 및 [Authorize] 특성을 사용할 수 있습니다. 따라서 HTTPS를 통해서만 액세스 할 수있는 LogOn 작업을 사용하여 AccountController을 가질 수 있습니다.

public class AccountController: Controller 
{ 
    [HttpPost] 
    [RequireHttps] 
    public ActionResult LogOn(string username, string password) 
    { 
     // TODO: verify the credentials and emit an authentication cookie if valid 
     // return some result (JSON?) to indicate whether the operation succeeded or 
     // not 
    } 
} 

후 남아있는 모든 당신이 [Authorize] 속성을 보호하려는 다른 컨트롤러 액션을 장식하는 것입니다 :이 컨트롤러는 클라이언트가 인증하고 API에 액세스하기 위해 재사용 될 것이다 인증 쿠키를 얻을 수

public class ApiController : Controller 
{ 
    [HttpPost] 
    [Authorize] 
    public JsonResult Foo(string input) 
    { 
     ... 
    } 
} 

이제 클라이언트는 먼저 LogOn 작업을 호출하고 해당 인증 쿠키를 응답에서 가져와야합니다.이 인증 쿠키는 후속 API 호출을 통해 전송됩니다.

+0

대린 감사합니다. 저는 RequireHttps에 대해 몰랐습니다. 타사 개발자가 내 API를 사용하여 빌드하는 것을 허용하려면 어떻게해야합니까? 나는 그들이 전화를 할 때마다 username/pw를 기본적으로 제출하는 무국적 API를 원한다. 예를 들어, 일부 레일 개발자가 Foo를 호출하는 웹 앱을 만들려는 경우 문제가되지 않아야하며 개발자 계정에 적절한 사용자 이름/pw가있는 URL을 호출하기 만하면됩니다. 페이스 북이 내가 생각하는 개발자 키를 사용하는 것과 비슷하다. –

+1

@Wesley Tansey,이 경우에는 클라이언트가 전달한 일부 토큰의 유효성을 확인하는 사용자 정의 'Authorize' 속성을 작성할 수 있습니다. 그것은 사용자 정의 HTTP 헤더 또는 다른 뭔가가 될 수 있습니다.사용자 이름/패스워드가 될 수도 있고, 클라이언트가 각 요청을 보낼 때 그리고 오버라이드 된'AuthorizeCore' 메쏘드에서 해독하고 그 유효성을 검증하기 위해 필요한 개인 키를 클라이언트에게 보낼 수 있습니다. –

+0

감사합니다. 그게 내가 생각한거야. 같은 일반적인 작업이 .NET에서 좀 더 솔직해야합니다. 요즘 웹 앱을 만드는 거의 모든 개발자 API가 필요하지 않습니까? –

0

여기서 원하는 것을 수행하려면 [Authorize] 속성을 사용할 수 있어야합니다. MSDN의 다음 세부 정보 및 예를 참조하십시오. http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx

특정 역할 또는 특정 역할의 사용자에게 권한을 부여 할 수 있습니다.

새 (비어 있지 않은) ASP.NET MVC 프로젝트를 만들 때 제공되는 기본 폼 기반 인증을 사용하면 사용자를 인증 할 수 있습니다.

+0

나는 Authorize 속성을 알고 있습니다. 그게 나에게 효과가 있을지 모르겠다. 타사 응용 프로그램에서 사용할 수있는 개발자 API를 만들고 싶습니다. 선호하지 않는 API는 상태 비 저장 API입니다. 예를 들어, Gmail에서 이메일을 읽고 Foo로 처리 한 후 브라우저에 결과를 표시하는 Rapportive 스타일 브라우저 플러그인을 생각해보십시오. –

관련 문제