2017-06-11 29 views
5

Tôi đang cố định cấu hình IdentityServer4 bằng docker nhưng tôi không thể làm cho nó hoạt động được. Để bắt đầu, tôi đã Client dụ Credential của tài liệu máy chủ sắc: Protecting an API using Client CredentialsIdentity Server 4 và docker

IdentityServer
Hosted trên cổng 5000

WebAPI
Hosted trên cổng 5001

Trong Configure phương pháp của các tập tin Startup.cs của WebApi của tôi Tôi đã làm như sau (vấn đề có thể ở đây):

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
     { 
      Authority = "http://web:5000",     
      RequireHttpsMetadata = false, 
      ApiName = "api1" 
     }); 

Khách hàng
Và client

// Everything is fine here... 
var disco = await DiscoveryClient.GetAsync("http://localhost:5000"); 
var tokenClient = new TokenClient(disco.TokenEndpoint, "client", "secret"); 
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("api"); 

// This does not work 
var client = new HttpClient(); 
client.SetBearerToken(tokenResponse.AccessToken); 
var response = await client.GetAsync("http://localhost:5001/identity"); 

Vấn đề có lẽ là trong WebAPI tôi:

1) Nếu tôi đặt quyền localhost: 5000, tôi nhận được một máy chủ nội bộ lỗi: "Không thể lấy cấu hình từ: 'http://localhost:5000/.well-known/openid-configuration'" có ý nghĩa vì localhost: 5000 không rõ trong vùng chứa này

2) Nếu tôi đặt quyền thành http://web:5000 Tôi nhận được lỗi ủy quyền: "Xác thực nhà phát hành không thành công. Tổ chức phát hành: 'http://localhost:5000'. Không phù hợp: validationParameters.ValidIssuer: 'http://web:5000' hoặc validationParameters.ValidIssuers "mà cũng có ý nghĩa nhưng tôi không biết nếu nó có thể thay đổi tên cơ quan? Tôi cũng đã cố gắng để thiết lập các IssuerUri trong dự án IdentityServer nhưng nó didn ' t giúp đỡ

Trả lời

5

Mạng

giả sử bạn có hai máy vật lý:. C1 và C2 Mỗi máy là một máy chủ Docker

C1 chạy Auth chứa

C2 chạy WebAPI containe.. r.

Khi bạn hiển thị cổng 5000 trong Auth dockerfile, địa chỉ C1:5000 phải có thể truy cập từ C2 từ vùng chứa WebApi. Bạn có thể thích IP đến DNS, điều đó không quan trọng. Hơn nữa, bạn có thể thực hiện yêu cầu GET thành công để http://C1:5000/.well-known/openid-configuration để chắc chắn.

Có rất nhiều vấn đề về mạng mà bạn có thể gặp phải để đạt được điều đó. Ví dụ: What would prevent code running in a Docker container from connecting to a database on a separate server?

Issuer xác nhận

Issuer validation failed

URL quyền của khách hàng của bạn khác với Auth hostname. Theo mặc định, URL ủy quyền phải bằng issuer giá trị thuộc tính (thuộc tính này nằm trong phản hồi tài liệu tự động phát hiện máy chủ Identity).

issuer giá trị tài sản phụ thuộc vào yêu cầu web của khách hàng của bạn:

GET http://127.0.0.1:6000/.well-known/openid-configuration -> "issuer": "http://127.0.0.1:6000" 
GET http://localhost:6000/.well-known/openid-configuration -> "issuer": "localhost:6000" 

Cố gắng thiết lập IssuerUri đến một hằng số cho một môi trường dev:

services.AddIdentityServer(x => 
{ 
    x.IssuerUri = "foo"; 
}) 

để đạt được một giá trị không đổi issuer. Đây allowes để gọi nhận dạng Server bằng bất kỳ URL hợp lệ (sử dụng IP, tên máy hoặc DNS):

GET http://anything/.well-known/openid-configuration -> "issuer": "foo" 

DiscoveryClient cũng xác nhận issuer giá trị. Đó là một sự bình đẳng đơn giản comparison:

public bool ValidateIssuerName(string issuer, string authority) 
{ 
    return string.Equals(issuer, authority, StringComparison.Ordinal); 
} 

Bạn có thể vô hiệu hóa nó bằng cách:

DiscoveryClient.Policy.ValidateIssuerName = false; 

FYI, IssuerUri thiết is not recommended cho một môi trường sản xuất:

IssuerUri Set the issuer name that will appear in the discovery document and the issued JWT tokens. It is recommended to not set this property, which infers the issuer name from the host name that is used by the clients.

+0

Làm như vậy phá vỡ phần đầu tiên của tôi client: var disco = đang chờ DiscoveryClient.GetAsync ("http: // localhost: 5000"); có ngoại lệ sau: Lỗi = "Tên tổ chức phát hành không khớp với quyền: foo" 'Xem bản chỉnh sửa của tôi để biết thêm thông tin – Bidou

+0

@Bidou bạn có chắc đó là dòng chính xác không? 'DiscoveryClient.GetAsync' chỉ cần một yêu cầu GET và phân tích một phản hồi. Và sau khi tên tổ chức phát hành thay đổi, tất cả các mã thông báo phải được thay thế bằng mã thông báo mới. –

+0

Thực ra nó hơi mệt. Nếu tôi kiểm tra 'DiscoveryResponse' được trả về bởi' GetAsync', tôi có thể thấy thuộc tính 'Raw' có tập đáp ứng json của nó (ví dụ,' tổ chức phát hành' cũng như 'tokenendpoint' đang ở đó) nhưng thuộc tính' Lỗi' chứa thông báo được đề cập ở trên "Tên tổ chức phát hành không khớp với quyền: foo". Thuộc tính TokenEndpoint là null (ngay cả khi nó nằm trong json thô) và sau đó một NullPointerException xảy ra vì dòng tiếp theo sử dụng thuộc tính này để intanciated TokenClient .... – Bidou

Các vấn đề liên quan