IdentityServer에서 토큰 검색, 사용 및 유효성 검사


📮 문의하기 🇧🇷 🇺🇸 🇫🇷



이것은 클라이언트 응용 프로그램이 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로 직접 이동하여 변경 사항이 포함된 새로운 풀 리퀘스트를 여세요.

좋은 웹페이지 즐겨찾기