6

지난 며칠 동안 어려움을 겪고있는 것에 대한 피드백/조언 및 정보를 얻기 위해 게시하고 있습니다. 시작하려면 프로젝트를 빨리 분해하십시오. 다음 올바른 로그인에 인증 토큰을 발행하고 OWIN를 사용 (IIS에서 호스팅) 및 ASP.NET 신원 -외부 웹 API에서 제공하는 OAuth Bearer Token 인증

  1. WebAPI 자원 & 인증 서버 :

    솔루션 2 응용 프로그램이 있습니다 다양한 컨트롤러에 대한 요청을 허용합니다.

  2. MVC 클라이언트 응용 프로그램이 - 아직 어떠한 권한은 없지만 모든 데이터를 얻기 위해 WebAPI 자원 서버를 호출 할 것이다 (나는 그것을 알아낼 때까지). 이러한 호출은 클라이언트 응용 프로그램의 AJAX 호출이없는 클라이언트 응용 프로그램의 컨트롤러 작업으로 만 이루어집니다.

클라이언트 응용 프로그램에는 자체 데이터 소스가 없습니다. 모든 정보는 WebAPI 서비스가 액세스 할 수있는 데이터베이스에 저장되므로 본질적으로 올바른 자격 증명을 제공하고 클라이언트 응용 프로그램이 베어러 토큰을 받으면 응용 프로그램이 권한있는 것으로 볼 수있는 방법을 제공해야합니다.

  • 이 처리하는 가장 좋은 방법은 무엇입니까?
  • 는 서버의 OAuth를 설정을 사용하도록 클라이언트 측에서 OWIN를 구성 할 수 있습니까? 잘못된 트리를 짖고 있으며 HTTPClients 만 사용해야합니까?
  • 나는 토큰 소지자를 역 직렬화 및 세션에 저장하고, 는 클라이언트 측에서 다음을 확인하기 위해 내 자신의 인증 공급자를 작성할 수?

내 초기 우려는 무기명 토큰을 남용하고 이상적인 솔루션으로 자갈을 넣으려고하는 것입니다. 지금까지 발견 한 외부 권한 부여의 모든 예는 Google/Facebook/Twitter에서 호스팅하는 제공 업체를 호출하여 사용자가 자신이 말하는 사람인지 확인한 다음 시스템에 사용자 레코드를 만드는 것으로 이동합니다. 내 응용 프로그램은 이것을 할 수 없습니다. 보안에 관해서

나는 IP 검증과 함께 식별자와 비밀을 제공하여 요청이 클라이언트 응용 프로그램에서 온 한 검증 할 필터를 도입 할 계획이었다.

나는 이것이 약간 열린 상태일지도 모른다는 것을 알고 있지만, 어떤 조언을 해 주시면 감사하겠습니다. 프로젝트의 범위는 웹 서비스가 데이터베이스에만 액세스 할 수 있다는 것입니다. MVC 클라이언트 응용 프로그램은 다른 서버에서 호스팅되며 서비스는 해당 클라이언트 응용 프로그램의 요청 만 수락합니다.

+0

좋은 질문 .... –

답변

5

당신은 베어러 토큰의 유효성을 검사하여 MVC 응용 프로그램에서 데이터 소스에 액세스 할 필요가 없습니다. 기본적으로, 당신은

  • MVC 응용 프로그램이 webapi에서 access_token를 요청하고 사용자 인터페이스 클라이언트에 전달, 다음과 같은 방법으로 그것을 할 수 있습니다 (의 브라우저를 가정 해 봅시다).

  • 브라우저 쿠키/로컬 스토리지에 access_token과를 저장하고 이후의 모든 요청에 ​​대해 MVC 응용 프로그램에 전송합니다.

  • MVC 앱에서 ActionFilter을 만들어 브라우저의 요청에 헤더에 제공된 토큰이 있는지 확인하십시오. 그렇지 않은 경우 요청을 거부하십시오.

  • MVC 앱은 Authorization 헤더의 access_token을 webapi로 전달합니다. (-> 클라이언트 및 MVC 응용 프로그램 < - MVC 응용 프로그램 < 사이> WebAPI) 모든 통신에 대한

  • 를 사용하여 HTTPS를

당신은 더 당황하거나 암호화 할 수있는 access_token 당신은 MVC 응용 프로그램에 WebAPI에서 얻을 쪽을 추가 보안을 위해 만들었지 만 해독 된 버전을 다시 WebAPI로 보내야합니다.

+0

의견을 보내 주셔서 감사합니다. HTTPS는 프로덕션 버전에서 사용됩니다. 내가 고민하는 부분은 클라이언트 응용 프로그램에 기본 보안을 구현하는 방법을 이해하는 것입니다. 가능하다면 Authorize Attribute, AllowAnonymous 등과 같은 기존 기능 중 일부를 사용하고 싶습니다. My WebAPI는 자체 사용자 저장소 및 관리자를 가지고 있기 때문에이 작업을 수행 할 수 있지만 어떤 솔루션이 가장 좋을까요? 않는 클라이언트 응용 프로그램에 권한을 추가하기위한? – CannonFodder

+0

MVC 클라이언트 응용 프로그램은 무기명 토큰의 유효성을 검사 할 필요가 없습니다. 요청에 토큰이 있는지 확인하기 만하면됩니다 (이것은 MVC 앱 측에서 구현할 수있는 기본 보안입니다). ActionFilter를 작성하고 Authorize 속성과 같이 사용하여이를 수행 할 수 있습니다. – su8898

+0

나는 그것이 합리적이라고 생각한다. 나는 무기명 토큰의 유효성을 검사 할 계획이 아니 었습니다. 계획은 그것을 잡아서 세션에 저장하고 존재를 확인한 다음 거기에서 요청을 처리하는 것이 었습니다. 만료되었거나 재발행 토큰을 들여다 보도록 요청할 것입니다. 이것은 나에게 조금 새로운 것이므로, 내 주요 관심사는 아마도 내가 약간의 결점을 간과하고 있다는 것이었다. 내 질문에 답한 것 같아. – CannonFodder

3

나는 나의 대답은 조금 늦은 실현,하지만 어쩌면 그것은 다른 사람을 도움 :

당신이 API에서 얻을 베어러 토큰은 API가 해독 할 수있는 암호화 된 주장의 목록이 있습니다. 클라이언트의 리소스를 제한 할 수 있도록 MVC 응용 프로그램에서도 이러한 클레임이 필요하다고 가정합니다.

그래서 내가 한 것은 토큰을 먼저 얻는 것입니다. API 리소스 api/me/claims를 사용하면 클라이언트에서 읽을 수있는 클레임 ​​목록을 얻을 수 있습니다. 이 목록을 기반으로 사용자 정의 클레임 기반 권한 부여 특성을 사용하여 MVC 클라이언트 응용 프로그램의 리소스에 대한 액세스를 허용 할 수 있습니다. 또한 클라이언트 세션의 쿠키에 클레임을 저장할 수 있습니다. 다음은 클레임을 가져 오는 API 컨트롤러의 코드입니다.

[RoutePrefix("api/me/claims")] 
public class ClaimsController : BaseApiController 
{ 
    [Authorize] 
    [Route("")] 
    public IHttpActionResult GetClaims() 
    { 
     var identity = User.Identity as ClaimsIdentity; 

     var claims = from c in identity.Claims 
        select new 
        { 
         subject = c.Subject.Name, 
         type = c.Type, 
         value = c.Value 
        }; 

     return Ok(claims); 
    } 
} 

아이디어는 클라이언트 측에서 기록 된 사용자의 ClaimsIdentity 객체를 재구성하여 세션에 추가하는 것입니다.

토큰이 충분하지 않습니다. MVC 클라이언트 응용 프로그램에서 사용자가 볼 수있게 만든 리소스의 API에서 승인되지 않은 응답을받을 위험이 있습니다. 모든 요청에 ​​HTTPS를 사용하는 것이 좋습니다.