Idnentiy Server 는 클 라 이언 트 증빙 서 류 를 사용 하여 API 에 접근 하 는 인 스 턴 스 코드 를 사용 합 니 다.

6471 단어 IdnentiyServerAPI
상황 은 다음 과 같 습 니 다.한 클 라 이언 트 가 api 에 접근 하려 면 사용자 가 로그 인 할 필요 가 없 지만 api 를 외부 에 직접 노출 시 키 고 싶 지 않 습 니 다.이 때 idenity server 를 사용 하여 접근 권한 을 추가 할 수 있 습 니 다.
클 라 이언 트 는 clientid 와 secrect 를 통 해 identitserver 의 Token Endpoint 를 방문 하여 accesstoken 을 가 져 옵 니 다.
이 어 클 라 이언 트 는 accesstoken 을 머리 인증 으로 웹 api 에 접근 합 니 다.(웹 api 에 idenity server 에 대한 인증 이 추가 되 었 습 니 다).

코드 구현:그 중에서"http://localhost:5000"는 idenity server 주소 이 고"http://localhost:5001"는 api 주소 입 니 다.
idenity server:idenity server 에 api 와 클 라 이언 트 를 추가 합 니 다.다음 과 같 습 니 다.api 1 자원,client 클 라 이언 트 를 정의 합 니 다.client 클 라 이언 트 는 clientCredentials(클 라 이언 트 증빙)모드 로 지정 하고 api 1 에 접근 할 수 있 도록 합 니 다.

public class Config
 {
  // scopes define the API resources in your system
  public static IEnumerable<ApiResource> GetApiResources()
  {
   return new List<ApiResource>
   {
    new ApiResource("api1", "My API")
   };
  }
  // clients want to access resources (aka scopes)
  public static IEnumerable<Client> GetClients()
  {
   // client credentials client
   return new List<Client>
   {
    new Client
    {
     ClientId = "client",
     AllowedGrantTypes = GrantTypes.ClientCredentials,
     ClientSecrets = 
     {
      new Secret("secret".Sha256())
     },
     AllowedScopes = { "api1" }
    }
   };
  }
 }
startup 에서 idenity server 를 설정 하면 다음 과 같 습 니 다.

public class Startup
 {
  public void ConfigureServices(IServiceCollection services)
  {
   // configure identity server with in-memory stores, keys, clients and scopes
   services.AddIdentityServer()
    .AddDeveloperSigningCredential()
    .AddInMemoryApiResources(Config.GetApiResources())
    .AddInMemoryClients(Config.GetClients());
  }
  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  {
   if (env.IsDevelopment())
   {
    app.UseDeveloperExceptionPage();
   }
   app.UseIdentityServer();
  }
 }
WebApi:api 에 idenity server 의 인증 을 추가 합 니 다.코드 는 다음 과 같 습 니 다.그 중에서 같은 api 이름 을 정 의 했 습 니 다."http://localhost:5000"는 idenity server 의 주소 입 니 다.

public class Startup
 {
  public void ConfigureServices(IServiceCollection services)
  {
   services.AddMvcCore()
    .AddAuthorization()
    .AddJsonFormatters();
   services.AddAuthentication("Bearer")
    .AddIdentityServerAuthentication(options =>
    {
     options.Authority = "http://localhost:5000";
     options.RequireHttpsMetadata = false;
     options.ApiName = "api1";
    });
  }
  public void Configure(IApplicationBuilder app)
  {
   app.UseAuthentication();
   app.UseMvc();
  }
 }
 인증 할 컨트롤 러 추가:

 [Route("[controller]")]
 [Authorize]
 public class IdentityController : ControllerBase
 {
  [HttpGet]
  public IActionResult Get()
  {
   return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
  }
 }
클 라 이언 트:
여기 서 는 Identity Model 라 이브 러 리 를 사용 합 니 다.
실제 요청 은 다음 과 같 습 니 다.
1.엑 세 스 토 큰 가 져 오기:http://localhost:5000/connect/token?client_id=client&client_secret=secret&grant_type=client_credentials&scope=api1
2.api 1 요청

http://localhost:5001/identity
Headers
Authorization:accesstoken

public class Program
 {
  public static void Main(string[] args) => MainAsync().GetAwaiter().GetResult();
  private static async Task MainAsync()
  {
    //  identitserver       
   var disco = await DiscoveryClient.GetAsync("http://localhost:5000");
   if (disco.IsError)
   {
    Console.WriteLine(disco.Error);
    return;
   }
   //    api1     accesstoken
   var tokenClient = new TokenClient(disco.TokenEndpoint, "client", "secret");
   var tokenResponse = await tokenClient.RequestClientCredentialsAsync("api1");
   if (tokenResponse.IsError)
   {
    Console.WriteLine(tokenResponse.Error);
    return;
   }
   Console.WriteLine(tokenResponse.Json);
   Console.WriteLine("

"); // accesstoken http , api1 var client = new HttpClient(); client.SetBearerToken(tokenResponse.AccessToken); var response = await client.GetAsync("http://localhost:5001/identity"); if (!response.IsSuccessStatusCode) { Console.WriteLine(response.StatusCode); } else { var content = await response.Content.ReadAsStringAsync(); Console.WriteLine(JArray.Parse(content)); } } }
ps:
1.이 기본 accesstoken 은 jwt 형식 입 니 다.클 라 이언 트 가 api 를 방문 할 때 api 는 시작 할 때 idenity 에 방문 하여 비밀 키 를 가 져 오 면 됩 니 다.referencetoken 이 라면 클 라 이언 트 가 api 에 접근 할 때 api 가 권한 을 부여 해 야 하 는 것 은 idenity server 를 다시 요청 합 니 다.또한 api 는 비밀 키 를 설정 해 야 합 니 다.client 는 AccessTokenType 속성 을 Reference 로 설정 해 야 합 니 다.
2.AccessTokenLifetime(token 생존 시간)을 사용자 정의 할 수 있 습 니 다.기본 값 은 3600 초,즉 한 시간 입 니 다.
총결산
위 에서 말 한 것 은 편집장 이 소개 한 Idnentiy server-클 라 이언 트 증빙 서 류 를 이용 하여 API 를 방문 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기