IdentityServer에서 토큰 검색, 사용 및 유효성 검사
25417 단어 webapiidentiyserverclienttoken
📮 문의하기 🇧🇷 🇺🇸 🇫🇷
이것은 클라이언트 응용 프로그램이 Identity Server에서 토큰을 검색하고 이를 WebApi에서 사용하여 끝점을 사용하는 방법의 예입니다.
이 프로젝트가 생성된 방법
이 예제는 Duende documentation을 기반으로 작성되었습니다.
신원 서버
샘플의 ID 공급자입니다.
Duende 템플릿 설치
dotnet new --install Duende.IdentityServer.Templates
빈 솔루션 만들기
dotnet new sln -n IdentityServerDemo
ID 서버 프로젝트 만들기
dotnet new isempty -n IdentityServer
빈 솔루션에 Identity Server 프로젝트 추가
dotnet sln add .\IdentityServer\IdentityServer.csproj
config.cs에 범위 추가
public static IEnumerable<ApiScope> ApiScopes =>
new ApiScope[]
{ new ApiScope(name: "campelo-api", displayName: "CampeloAPI") };
config.cs에 클라이언트 추가
public static IEnumerable<Client> Clients =>
new Client[]
{ new Client
{
ClientId = "client",
// no interactive user, use the clientid/secret for authentication
AllowedGrantTypes = GrantTypes.ClientCredentials,
// secret for authentication
ClientSecrets =
{
new Secret("secret".Sha256())
},
// scopes that client has access to
AllowedScopes = { "campelo-api" }
} };
Openid 구성
이제 ID 서버에서 openid-configuration에 액세스할 수 있습니다. 솔루션을 실행하고 https://localhost:5001/.well-known/openid-configuration으로 이동합니다. 따라서 이와 같은 것을 검색할 수 있습니다.
{
"issuer":"https://localhost:5001",
"jwks_uri":"https://localhost:5001/.well-known/openid-configuration/jwks",
"authorization_endpoint":"https://localhost:5001/connect/authorize",
"token_endpoint":"https://localhost:5001/connect/token",
"userinfo_endpoint":"https://localhost:5001/connect/userinfo",
"end_session_endpoint":"https://localhost:5001/connect/endsession",
"check_session_iframe":"https://localhost:5001/connect/checksession",
"revocation_endpoint":"https://localhost:5001/connect/revocation",
"introspection_endpoint":"https://localhost:5001/connect/introspect",
"device_authorization_endpoint":"https://localhost:5001/connect/deviceauthorization",
"backchannel_authentication_endpoint":"https://localhost:5001/connect/ciba",
"frontchannel_logout_supported":true,
"frontchannel_logout_session_supported":true,
"backchannel_logout_supported":true,
"backchannel_logout_session_supported":true,
"scopes_supported":[
"openid",
"campelo-api",
"offline_access"
],
"claims_supported":[
"sub"
],
"grant_types_supported":[
"authorization_code",
"client_credentials",
"refresh_token",
"implicit",
"urn:ietf:params:oauth:grant-type:device_code",
"urn:openid:params:grant-type:ciba"
],
"response_types_supported":[
"code",
"token",
"id_token",
"id_token token",
"code id_token",
"code token",
"code id_token token"
],
"response_modes_supported":[
"form_post",
"query",
"fragment"
],
"token_endpoint_auth_methods_supported":[
"client_secret_basic",
"client_secret_post"
],
"id_token_signing_alg_values_supported":[
"RS256"
],
"subject_types_supported":[
"public"
],
"code_challenge_methods_supported":[
"plain",
"S256"
],
"request_parameter_supported":true,
"request_object_signing_alg_values_supported":[
"RS256",
"RS384",
"RS512",
"PS256",
"PS384",
"PS512",
"ES256",
"ES384",
"ES512",
"HS256",
"HS384",
"HS512"
],
"authorization_response_iss_parameter_supported":true,
"backchannel_token_delivery_modes_supported":[
"poll"
],
"backchannel_user_code_parameter_supported":true
}
API 프로젝트
웹 API 프로젝트.
새 웹 API 프로젝트 만들기
dotnet new webapi -n WebApi
솔루션에 webapi 추가
dotnet sln add .\WebApi\WebApi.csproj
JWT 베어러 인증 추가
dotnet add .\WebApi\WebApi.csproj package Microsoft.AspNetCore.Authentication.JwtBearer
JWT Bearer를 기본 인증 체계로 설정
Program.cs 또는 Startup.cs 파일을 업데이트합니다.
builder.Services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = "https://localhost:5001";
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false
};
});
/// UseAuthentication right before UseAuthorization
app.UseAuthentication();
app.UseAuthorization();
테스트를 위한 새 컨트롤러 추가
[Route("identity")]
[Authorize]
public class IdentityController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
}
}
포트 6001에서 수신 대기하도록 WebAPI 구성
속성 폴더에서 launchSettings.json 파일을 편집합니다.
"applicationUrl": "https://localhost:6001"
WebAPI 프로젝트 실행
이제 액세스를 시도할 때 401(권한 없음) 오류 응답이 나타납니다https://localhost:6001/identity.
클라이언트 프로젝트
콘솔 클라이언트 프로젝트 생성
dotnet new console -n Client
솔루션에 클라이언트 프로젝트 추가
dotnet sln add .\Client\Client.csproj
클라이언트 프로젝트에 IdentityModel 추가
dotnet add .\Client\Client.csproj package IdentityModel
메타데이터에서 엔드포인트 검색
var client = new HttpClient();
var disco = await client.GetDiscoveryDocumentAsync("https://localhost:5001");
if (disco.IsError)
{
Console.WriteLine(disco.Error);
return;
}
요청 토큰
var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
Address = disco.TokenEndpoint,
ClientId = "client",
ClientSecret = "secret",
Scope = "campelo-api"
});
if (tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
return;
}
Console.WriteLine(tokenResponse.AccessToken);
WebAPI 호출
var apiClient = new HttpClient();
apiClient.SetBearerToken(tokenResponse.AccessToken);
var response = await apiClient.GetAsync("https://localhost:6001/identity");
if (!response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode);
}
else
{
var doc = JsonDocument.Parse(await response.Content.ReadAsStringAsync()).RootElement;
Console.WriteLine(JsonSerializer.Serialize(doc, new JsonSerializerOptions { WriteIndented = true }));
}
클라이언트 실행
IdentityServer 및 WebAPI가 실행 중인지 확인하고 클라이언트 프로젝트를 실행하여 다음과 같은 것을 확인하십시오.
소스 코드
Source code
오타 또는 제안?
이 블로그 게시물에서 오타, 개선할 수 있는 문장 또는 업데이트해야 할 사항을 발견한 경우 git 저장소를 통해 액세스하고 풀 요청을 할 수 있습니다. github에 익숙하다면 댓글을 게시하는 대신 https://github.com/campelo/documentation로 직접 이동하여 변경 사항이 포함된 새로운 풀 리퀘스트를 여세요.
Reference
이 문제에 관하여(IdentityServer에서 토큰 검색, 사용 및 유효성 검사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/campelo/retrieving-using-and-validating-token-from-an-identityserver-35e7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
샘플의 ID 공급자입니다.
Duende 템플릿 설치
dotnet new --install Duende.IdentityServer.Templates
빈 솔루션 만들기
dotnet new sln -n IdentityServerDemo
ID 서버 프로젝트 만들기
dotnet new isempty -n IdentityServer
빈 솔루션에 Identity Server 프로젝트 추가
dotnet sln add .\IdentityServer\IdentityServer.csproj
config.cs에 범위 추가
public static IEnumerable<ApiScope> ApiScopes =>
new ApiScope[]
{ new ApiScope(name: "campelo-api", displayName: "CampeloAPI") };
config.cs에 클라이언트 추가
public static IEnumerable<Client> Clients =>
new Client[]
{ new Client
{
ClientId = "client",
// no interactive user, use the clientid/secret for authentication
AllowedGrantTypes = GrantTypes.ClientCredentials,
// secret for authentication
ClientSecrets =
{
new Secret("secret".Sha256())
},
// scopes that client has access to
AllowedScopes = { "campelo-api" }
} };
Openid 구성
이제 ID 서버에서 openid-configuration에 액세스할 수 있습니다. 솔루션을 실행하고 https://localhost:5001/.well-known/openid-configuration으로 이동합니다. 따라서 이와 같은 것을 검색할 수 있습니다.
{
"issuer":"https://localhost:5001",
"jwks_uri":"https://localhost:5001/.well-known/openid-configuration/jwks",
"authorization_endpoint":"https://localhost:5001/connect/authorize",
"token_endpoint":"https://localhost:5001/connect/token",
"userinfo_endpoint":"https://localhost:5001/connect/userinfo",
"end_session_endpoint":"https://localhost:5001/connect/endsession",
"check_session_iframe":"https://localhost:5001/connect/checksession",
"revocation_endpoint":"https://localhost:5001/connect/revocation",
"introspection_endpoint":"https://localhost:5001/connect/introspect",
"device_authorization_endpoint":"https://localhost:5001/connect/deviceauthorization",
"backchannel_authentication_endpoint":"https://localhost:5001/connect/ciba",
"frontchannel_logout_supported":true,
"frontchannel_logout_session_supported":true,
"backchannel_logout_supported":true,
"backchannel_logout_session_supported":true,
"scopes_supported":[
"openid",
"campelo-api",
"offline_access"
],
"claims_supported":[
"sub"
],
"grant_types_supported":[
"authorization_code",
"client_credentials",
"refresh_token",
"implicit",
"urn:ietf:params:oauth:grant-type:device_code",
"urn:openid:params:grant-type:ciba"
],
"response_types_supported":[
"code",
"token",
"id_token",
"id_token token",
"code id_token",
"code token",
"code id_token token"
],
"response_modes_supported":[
"form_post",
"query",
"fragment"
],
"token_endpoint_auth_methods_supported":[
"client_secret_basic",
"client_secret_post"
],
"id_token_signing_alg_values_supported":[
"RS256"
],
"subject_types_supported":[
"public"
],
"code_challenge_methods_supported":[
"plain",
"S256"
],
"request_parameter_supported":true,
"request_object_signing_alg_values_supported":[
"RS256",
"RS384",
"RS512",
"PS256",
"PS384",
"PS512",
"ES256",
"ES384",
"ES512",
"HS256",
"HS384",
"HS512"
],
"authorization_response_iss_parameter_supported":true,
"backchannel_token_delivery_modes_supported":[
"poll"
],
"backchannel_user_code_parameter_supported":true
}
API 프로젝트
웹 API 프로젝트.
새 웹 API 프로젝트 만들기
dotnet new webapi -n WebApi
솔루션에 webapi 추가
dotnet sln add .\WebApi\WebApi.csproj
JWT 베어러 인증 추가
dotnet add .\WebApi\WebApi.csproj package Microsoft.AspNetCore.Authentication.JwtBearer
JWT Bearer를 기본 인증 체계로 설정
Program.cs 또는 Startup.cs 파일을 업데이트합니다.
builder.Services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = "https://localhost:5001";
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false
};
});
/// UseAuthentication right before UseAuthorization
app.UseAuthentication();
app.UseAuthorization();
테스트를 위한 새 컨트롤러 추가
[Route("identity")]
[Authorize]
public class IdentityController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
}
}
포트 6001에서 수신 대기하도록 WebAPI 구성
속성 폴더에서 launchSettings.json 파일을 편집합니다.
"applicationUrl": "https://localhost:6001"
WebAPI 프로젝트 실행
이제 액세스를 시도할 때 401(권한 없음) 오류 응답이 나타납니다https://localhost:6001/identity.
클라이언트 프로젝트
콘솔 클라이언트 프로젝트 생성
dotnet new console -n Client
솔루션에 클라이언트 프로젝트 추가
dotnet sln add .\Client\Client.csproj
클라이언트 프로젝트에 IdentityModel 추가
dotnet add .\Client\Client.csproj package IdentityModel
메타데이터에서 엔드포인트 검색
var client = new HttpClient();
var disco = await client.GetDiscoveryDocumentAsync("https://localhost:5001");
if (disco.IsError)
{
Console.WriteLine(disco.Error);
return;
}
요청 토큰
var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
Address = disco.TokenEndpoint,
ClientId = "client",
ClientSecret = "secret",
Scope = "campelo-api"
});
if (tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
return;
}
Console.WriteLine(tokenResponse.AccessToken);
WebAPI 호출
var apiClient = new HttpClient();
apiClient.SetBearerToken(tokenResponse.AccessToken);
var response = await apiClient.GetAsync("https://localhost:6001/identity");
if (!response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode);
}
else
{
var doc = JsonDocument.Parse(await response.Content.ReadAsStringAsync()).RootElement;
Console.WriteLine(JsonSerializer.Serialize(doc, new JsonSerializerOptions { WriteIndented = true }));
}
클라이언트 실행
IdentityServer 및 WebAPI가 실행 중인지 확인하고 클라이언트 프로젝트를 실행하여 다음과 같은 것을 확인하십시오.
소스 코드
Source code
오타 또는 제안?
이 블로그 게시물에서 오타, 개선할 수 있는 문장 또는 업데이트해야 할 사항을 발견한 경우 git 저장소를 통해 액세스하고 풀 요청을 할 수 있습니다. github에 익숙하다면 댓글을 게시하는 대신 https://github.com/campelo/documentation로 직접 이동하여 변경 사항이 포함된 새로운 풀 리퀘스트를 여세요.
Reference
이 문제에 관하여(IdentityServer에서 토큰 검색, 사용 및 유효성 검사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/campelo/retrieving-using-and-validating-token-from-an-identityserver-35e7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
dotnet new webapi -n WebApi
dotnet sln add .\WebApi\WebApi.csproj
dotnet add .\WebApi\WebApi.csproj package Microsoft.AspNetCore.Authentication.JwtBearer
builder.Services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = "https://localhost:5001";
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false
};
});
/// UseAuthentication right before UseAuthorization
app.UseAuthentication();
app.UseAuthorization();
[Route("identity")]
[Authorize]
public class IdentityController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
}
}
"applicationUrl": "https://localhost:6001"
콘솔 클라이언트 프로젝트 생성
dotnet new console -n Client
솔루션에 클라이언트 프로젝트 추가
dotnet sln add .\Client\Client.csproj
클라이언트 프로젝트에 IdentityModel 추가
dotnet add .\Client\Client.csproj package IdentityModel
메타데이터에서 엔드포인트 검색
var client = new HttpClient();
var disco = await client.GetDiscoveryDocumentAsync("https://localhost:5001");
if (disco.IsError)
{
Console.WriteLine(disco.Error);
return;
}
요청 토큰
var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
Address = disco.TokenEndpoint,
ClientId = "client",
ClientSecret = "secret",
Scope = "campelo-api"
});
if (tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
return;
}
Console.WriteLine(tokenResponse.AccessToken);
WebAPI 호출
var apiClient = new HttpClient();
apiClient.SetBearerToken(tokenResponse.AccessToken);
var response = await apiClient.GetAsync("https://localhost:6001/identity");
if (!response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode);
}
else
{
var doc = JsonDocument.Parse(await response.Content.ReadAsStringAsync()).RootElement;
Console.WriteLine(JsonSerializer.Serialize(doc, new JsonSerializerOptions { WriteIndented = true }));
}
클라이언트 실행
IdentityServer 및 WebAPI가 실행 중인지 확인하고 클라이언트 프로젝트를 실행하여 다음과 같은 것을 확인하십시오.
소스 코드
Source code
오타 또는 제안?
이 블로그 게시물에서 오타, 개선할 수 있는 문장 또는 업데이트해야 할 사항을 발견한 경우 git 저장소를 통해 액세스하고 풀 요청을 할 수 있습니다. github에 익숙하다면 댓글을 게시하는 대신 https://github.com/campelo/documentation로 직접 이동하여 변경 사항이 포함된 새로운 풀 리퀘스트를 여세요.
Reference
이 문제에 관하여(IdentityServer에서 토큰 검색, 사용 및 유효성 검사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/campelo/retrieving-using-and-validating-token-from-an-identityserver-35e7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(IdentityServer에서 토큰 검색, 사용 및 유효성 검사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/campelo/retrieving-using-and-validating-token-from-an-identityserver-35e7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)