기존 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 개의 질문이 남았습니다.
JwtBearer 미들웨어가 인증을 내 인증 서버로 전달하도록 할 수 있습니까? (openidConnect가 처리 할 수 있습니까?)
리소스 서버를 전달/패스 스루 토큰 발행 요청을 내 인증 서버에도 허용하여 나머지 API 클라이언트가 2 대의 서버를 처리하지 않아도됩니까?
OpenIddict 인증 서버에 인증서를 추가 한 후 jwks가 작동했고 리소스 서버 측에서 키를 얻을 수 있었고 유효성 검사가 리소스 서버에서 발생한다는 것을 알았습니다. (걱정스러운 signingkeys의 여러 등록이었습니다). 하지만 내 REST 클라이언트 앱은 초기 토큰 발급을 위해 인증 서버에 직접 문의해야합니다. 리소스 서버를 통해이 작업을 수행 할 수 있습니까? –
... 내 경우에는 내 리소스 서버에서 OpenIdConnect를 사용해서는 안된다고 언급했습니다. JwtBearer 만 사용하여 리소스 서버를 설정하는 방법에 대한 예제를 제공 할 수 있습니까? (openidconnect를 제거한 후 openidconnect 스키마에 대한 핸들러가 없으므로 auth.controller의 문제가 해결되지 않습니다. "무기명"으로 스키마를 변경하면 인증 서버에 연결하지 않고 401 만 제공합니다.) –
결국 작은 검색 방법을 사용하여 내 REST 클라이언트에게 권한을 찾을 위치를 알려주고 인증 서버에서 .well-known/openid-configuration을 사용하여 토큰 엔드 포인트를 찾습니다. –