2012-09-03 3 views
13

MVC4를 사용하는 웹 API를 작성 중입니다. 여러 클라이언트 유형에서 사용해야합니다. OpenID를 사용하여 인증하고 싶습니다.MVC4 웹 API에 OpenID를 통합하는 방법

이미 DotNetOpenAuth NuGet 패키지를 다운로드했지만, 지금까지 모든 예제는 API가 아닌 클라이언트 응용 프로그램 용입니다.

내 문제는 간단합니다. 클라이언트가 내 API에 인증 요청을 보내도록하고 싶습니다. API는 OpenID 공급자로 인증합니다. 그런 다음 API는 웹 API 호출 전체에서 [Authorize] 태그를 사용하기 위해 필요한 것을 설정합니다.

.NET 응용 프로그램에서 FormsAuthentication.SetCookie를 호출 할 수 있지만 다른 언어에 대한 구현하기 쉬운 솔루션이라는 것을 알고 있습니다.

간단히 말하면 질문입니다. 여러 언어에서 호출하고 사용할 수있는 Authorize 태그의 사용을 허용하는 MVC4 웹 API에 OpenID를 어떻게 통합합니까?

+1

DotNetOpenAuth에 대한 NuGet 패키지가이 날짜로 되돌아 오는 경우 (현재까지) 완전히 최신이 아닌 것으로 보입니다. OAUTH2 네임 스페이스가 포함되어 있지 않습니다. 대신이 [sourceforge 링크] (http://sourceforge.net/projects/dnoa/)를 사용하십시오. – Quickhorn

+0

이 프로젝트를 살펴보십시오. http://weblogs.asp.net/haithamkhedre/archive/2011/03/13/openid-authentication-with-asp-net-mvc3-dotnetopenauth-and-openid-selector.aspx –

답변

23

인증 및 권한 부여의 역할을 혼동시킬 수 있습니다. 귀하의 웹 API가 이고 모두이 필요합니다.

승인부터 시작하겠습니다. 모든 API (즉, 브라우저가 아닌 클라이언트 앱에서 액세스하는 웹 URL)는 익명 액세스를 허용하거나 승인 (즉, 승인)되어야합니다. 승인은 OAuth의 도메인입니다. OAuth (v2, 아마도)는 클라이언트가 WebAPI에 대한 호출 권한을 부여하는 방법을 설명합니다.

아마도 인증 프로세스의 일부로 사용자가 서비스에 로그인합니다. 이 사용자 로그인 단계는 인증입니다. 그리고 인증과 직각입니다. OpenID, 사용자 이름/암호, X.509 인증서 등을 통해 사용자를 인증하는지 여부는 WebAPI 호출이 승인되는 방법과 관련이 없어야합니다. 즉, WebAPI 메소드는 사용자 인증 방식에 신경을 쓰지 않아야합니다 (읽기 : OpenID가 무엇이든 관계 없음). 사용자에게 적용되는 인증 필터는 들어오는 요청에 대한 승인을 확인하고 액세스 권한을 부여한 계정의 사용자 이름, 액세스 수준, 인증 된 사용자의 ID 등 몇 가지 정보로 변환하는 인증 필터입니다. 클라이언트는 등

그래서 한 번에 단계는 전체 시나리오는 다음과 같이 갈 수 있습니다

  1. 제 3 자 클라이언트 응용 프로그램을 동작하는 사용자 (의이 클라이언트 응용 프로그램은 3이라고 편의상 가정하자 파티 웹 응용 프로그램)은 클라이언트가 사용자 이름으로 WebAPI에 액세스해야하는 기능을 사용하려고합니다.
  2. 클라이언트가 WebAPI에 대한 호출을 수행 할 때 클라이언트가 사용자의 제한된 권한을 부여 받아야합니다. 서비스에서 승인 엔드 포인트로 리디렉션되는 OAuth 2로 시작합니다. 이것이 DotNetOpenAuth를 사용하여 구현 된 경우 WebServerClient 클래스를 사용할 수 있습니다.
  3. 인증 끝 점이 OAuth 2 인증 서버 역할을 수행하므로 DotNetOpenAuth의 AuthorizationServer 클래스를 사용합니다. 첫 번째 작업은 요청에 포함 된 ASP.NET 폼 인증 쿠키가 있는지 확인하는 것입니다. 이 쿠키는 사용자가 이미 브라우저에서 서비스에 로그인했는지 여부와 그 사용자가 누구인지에 대한 자연스러운 표시입니다. 이 쿠키를 확인하는 것은 Controller.User에 대한 간단한 호출입니다. 권한 엔드 포인트는 클라이언트 응용 프로그램이 아닌 브라우저/사용자에 대한 응답이기 때문에 WebAPI보다는 MVC입니다. 쿠키가없고 Controller.User이 null이라고 가정합니다 (또는 User.Identity.IsAuthenticatedfalse).이 엔드 포인트 구현 방법은 OAuthAuthorizationServer 샘플을 참조하십시오.
  4. 인증 엔드 포인트는 들어오는 OAuth 2 인증 요청 URL 전체를 포함하는 검색어 문자열의 redirectUrl 매개 변수를 포함하여 사용자 로그인 페이지로 리디렉션됩니다.
  5. 사용자 로그인 페이지는 OpenID 의존 당사자의 역할을하는 MVC 엔드 포인트입니다. 이 끝점은 DotNetOpenAuth의 OpenIdRelyingParty 클래스를 사용합니다. 이 엔드 포인트는 OAuth 2 나 인증 항목에 대해 아무 것도 모릅니다. 단순히 사용자를 인증합니다. 사용자를 인증 한 후 redirectUrl 인수의 URL로 다시 리디렉션됩니다. 이 작업을 수행하는 방법은 OpenIdRelyingPartyMvc 샘플을 참조하십시오.
  6. 인증 엔드 포인트는 FormsAuthentication 쿠키가있는 것을 제외하고 이전 단계를 반복하므로 사용자가 클라이언트에 사용자 데이터에 액세스하도록 권한을 부여할지 묻는 페이지를 사용자에게 표시합니다. 사용자가 예를 클릭합니다. (주의 :이 사용자 인증 페이지에서 XSRF 및 클릭 재킹 완화 구현).
  7. 권한 엔드 포인트는 사용자의 긍정 응답을 처리하고 AuthorizationServer을 호출하여 권한 레코드를 작성하고 응답을 클라이언트에 리턴합니다. 이 호출의 결과 중 하나는 클라이언트에게 인증 코드를 제공하는 리디렉션 응답을 공식화하는 것입니다.
  8. 브라우저에서 인증 코드를 전달하는 클라이언트 앱의 URL을 가져 왔습니다. 그런 다음 클라이언트는 WebServerClient 클래스를 사용하여 액세스 토큰 (일반적으로 새로 고침 토큰)의 인증 코드를 교환합니다.
  9. 이제 클라이언트 앱은 HTTP Authorization 헤더의 OAuth 2를 통해 얻은 액세스 토큰을 포함하여 WebAPI URL을 직접 호출합니다.
  10. WebAPI가 OAuth2 리소스 서버의 역할을 채우고 들어오는 OAuth 2 액세스 토큰의 유효성을 검사하기 위해 WebAPI 메서드에 적용하는 권한 부여 필터 특성은 DotNetOpenAuth ResourceServer 클래스를 사용하여 작업을 수행합니다. OAuthResourceServer 샘플을 참조하거나이 작업을 수행하는 방법에 대해서는 David Christiansen's WebAPI sample을 참조 할 수 있습니다.

그게 전부입니다. 그리고 예, 클라이언트 역할은 그들이 사용하는 언어 나 라이브러리에 관계없이 쉽게 작성할 수 있습니다.

현재 내가 참조하는 DotNetOpenAuth 샘플은 NuGet을 통해 배포되지 않습니다. 너 get the samples from SourceForge.

관련 문제