2017-09-26 5 views
1

기존 mvc 코어 2.0 웹 응용 프로그램과 함께 사용할 OpenIdDict 인증 서버를 설정했습니다. 나는 프로덕션 응용 프로그램에서 OpenIdConnect 부분을 구현하기 전에 코드 흐름을 사용하고 테스트 MVC 웹 응용 프로그램 자원 서버를 만들었습니다.OpenIddict MVC 코어 2.0 및 JWT 리소스 서버 API

모든 것이 의도 한대로 작동하고 로그인하여 내 리소스에 액세스 할 수 있습니다.

휴식 클라이언트를위한 새로운 인증 아키텍처에서 api 베어러 인증을 사용해야합니다. Api는 동일한 리소스 서버에 배치됩니다.

내가 사용 JWT 내 OpenIddict을 설정 한 :

  options.AllowPasswordFlow(); 
      options.UseJsonWebTokens(); 
      options.AddSigningKey(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value))); 

은 ...

JwtBearer

 JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 
     JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear(); 

     services.AddAuthentication() 
      .AddJwtBearer(options => 
      { 
       options.Authority = "http://localhost:17004/"; 
       options.Audience = "MyAudience"; 
       options.RequireHttpsMetadata = false; 
       options.TokenValidationParameters = new TokenValidationParameters 
       { 
        NameClaimType = OpenIdConnectConstants.Claims.Subject, 
        RoleClaimType = OpenIdConnectConstants.Claims.Role, 
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value)) 
       }; 
      }); 
추가 ...와 암호 흐름 토큰 요청을 처리하기 위해 AuthorizationController.Exchange에 코드를 추가했다.

내 리소스 서버 Startup.cs에서 AddOpenIdConnect를 추가하고 signingKey (인증 서버와 동일한 키)를 추가했습니다.

  options.ResponseType = OpenIdConnectResponseType.Code; 
      options.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet; 
      options.TokenValidationParameters = new TokenValidationParameters() 
      { 
       IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value)) 
      }; 
      options.Authority = "http://localhost:17004/"; 

리소스 서버에 내 API에 액세스하려고 할 때 여전히 인증 할 수 있습니다 내 리소스 서버를이을 설정하고 모든 것이 작동하고 내 인증 서버에서 JWT 토큰을 얻기 위해 위해 RESTClient를 사용할 수 있지만 후에 때문에이 실패 베어러 스키마에 대한 유효성 검사기가 없습니다.

TokenValidationParameters에서 동일한 signingKey를 사용하여 리소스 서버에서 AddBearerToken을 호출하는 호출을 추가하면 실제로 작동합니다. 문제는 성공적이며 내 리소스에 액세스 할 수 있습니다.

그러나 내 설치가 의심 스럽다. 내 API를 호출 할 때 리소스 서버에서 내 토큰의 유효성 검사가 발생하므로 2 개의 질문이 남았습니다.

  1. JwtBearer 미들웨어가 인증을 내 인증 서버로 전달하도록 할 수 있습니까? (openidConnect가 처리 할 수 ​​있습니까?)

  2. 리소스 서버를 전달/패스 스루 토큰 발행 요청을 내 인증 서버에도 허용하여 나머지 API 클라이언트가 2 대의 서버를 처리하지 않아도됩니까?

답변

1

JwtBearer 미들웨어가 인증을 내 인증 서버로 전달하도록 할 수 있습니까? (openidConnect가 처리 할 수 ​​있습니까?)

JWT 베어러 미들웨어는 OpenIddict의 구성 끝점에서 검색된 서명 키를 사용하여 항상 로컬 유효성 검사를 수행합니다. 이 작업을 OpenIddict에 위임하도록 강제 할 방법이 없습니다.

그것은/경유 토큰 발급 요청 습관이 개 서버와 거래를해야 내 나머지 API 클라이언트 그래서 너무 내 인증 서버 앞으로 내 리소스 서버를 만들 수 있습니까?

토큰 유효성 검증 부분을 권한 서버에 위임하려면 JWT 미들웨어를 사용하지 마십시오. OpenIddict 옵션에서 인트로 스펙 션을 활성화하고 새로운 기밀 클라이언트 응용 프로그램 등록을 만들고 aspnet-contrib introspection middleware을 사용하십시오.이 클라이언트는 백 채널 HTTP 호출을 사용하여 들어오는 토큰의 유효성을 검사합니다.

+0

OpenIddict 인증 서버에 인증서를 추가 한 후 jwks가 작동했고 리소스 서버 측에서 키를 얻을 수 있었고 유효성 검사가 리소스 서버에서 발생한다는 것을 알았습니다. (걱정스러운 signingkeys의 여러 등록이었습니다). 하지만 내 REST 클라이언트 앱은 초기 토큰 발급을 위해 인증 서버에 직접 문의해야합니다. 리소스 서버를 통해이 작업을 수행 할 수 있습니까? –

+0

... 내 경우에는 내 리소스 서버에서 OpenIdConnect를 사용해서는 안된다고 언급했습니다. JwtBearer 만 사용하여 리소스 서버를 설정하는 방법에 대한 예제를 제공 할 수 있습니까? (openidconnect를 제거한 후 openidconnect 스키마에 대한 핸들러가 없으므로 auth.controller의 문제가 해결되지 않습니다. "무기명"으로 스키마를 변경하면 인증 서버에 연결하지 않고 401 만 제공합니다.) –

+0

결국 작은 검색 방법을 사용하여 내 REST 클라이언트에게 권한을 찾을 위치를 알려주고 인증 서버에서 .well-known/openid-configuration을 사용하여 토큰 엔드 포인트를 찾습니다. –

0

JWT는 OpenIdConnect에 필요한 토큰 형식이며 필수 항목입니다. JWT를 포함한 Oauth2와 함께 모든 토큰 형식을 사용할 수 있습니다. 따라서 JWT를 건너 뛰지 않아도됩니다.

+0

당신이 쓰는 단어가 내게 의미가 없기 때문에 나는 기초의 일부를 이해하는 데 문제가 있다고 생각합니다. 나는 어떤 흐름의 일부인지, 어떤 기술이 어디에 사용되는지 알아 내려고 많은 시간을 보냈으며, mvc core 2.0을 구성하는 방법과 oid가 어떻게 구현되어야 하는지를 찾는 것에서 완전히 잃어 버렸습니다. –

+0

나는 이것에 대한 기사를 작성했으며이 개념에 대한 개요를 가지고있다. 링크는 여기에 있습니다 - https://www.linkedin.com/pulse/microservices-security-openid-connect-manish-singh – ManishSingh

+0

좋은 기사. 나는 또한 지금 내가 옳은 것들을 물어볼 수 있기 때문에 내 mvc 설정에 대해 좀 더 알아 내 질문을 편집했습니다. –