2014-12-16 36 views
14

Tôi đang tạo ứng dụng Windows Phone 8.1 cho phép người dùng Azure xem đăng ký/dịch vụ của họ bằng API quản lý dịch vụ Azure. Việc xác thực được thực hiện bằng chứng chỉ quản lý và chứng chỉ được đính kèm với tất cả các yêu cầu đối với API. Nó hoạt động tốt cho một người dùng duy nhất. Nhưng vấn đề nảy sinh khi tôi cố gắng bao gồm một tính năng cho nhiều đăng ký. Tôi có thể cài đặt chứng chỉ trong kho chứng chỉ và truy xuất chứng chỉ đó. Nhưng vấn đề nảy sinh khi tôi gửi yêu cầu tới API. Mặc dù tôi đính kèm chứng chỉ chính xác, tôi nhận được lỗi 403 bị cấm. Đây là mã tôi đã sử dụng.Nhiều chứng chỉ với HttpClient

public async Task<Certificate> GetCertificate() 
{ 
      await CertificateEnrollmentManager.ImportPfxDataAsync(Certificate, "", ExportOption.Exportable, KeyProtectionLevel.NoConsent, InstallOptions.None, SubscriptionID); 
      CertificateQuery query = new CertificateQuery(); 
      query.FriendlyName = SubscriptionID; 
      var c = await CertificateStores.FindAllAsync(query); 
      return c[0]; 
} 

public async Task<HttpResponseMessage> SendRequest(string url,string version) 
{ 
     HttpResponseMessage response = null; 
     try 
     { 
      HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter(); 
      filter.ClientCertificate = await GetCertificate(); 
      HttpClient client = new HttpClient(filter); 
      HttpRequestMessage request = new HttpRequestMessage(); 
      request.RequestUri = new Uri(url); 
      request.Headers.Add("x-ms-version", version); 
      response = await client.SendRequestAsync(request, 0); 
      return response; 
     } 
     catch(Exception e) 
     { 
      var status=Windows.Web.WebError.GetStatus(e.HResult); 
      if (status == WebErrorStatus.CannotConnect) 
       throw new Exception("Cannot connect to internet. Check your connection."); 
      else if (status == WebErrorStatus.Disconnected) 
       throw new Exception("Connection was disconnected."); 
      else if (status == WebErrorStatus.ServiceUnavailable) 
       throw new Exception("Server was unavailable"); 
      else if (status == WebErrorStatus.ConnectionReset) 
       throw new Exception("Connection was reset."); 
      else if (status == WebErrorStatus.BadGateway) 
       throw new Exception("Bad gateway."); 
      else if (status == WebErrorStatus.InternalServerError) 
       throw new Exception("Internal server error occurred"); 
      else if (status == WebErrorStatus.HostNameNotResolved) 
       throw new Exception("Check your network connection. Host name could not be resolved."); 
     } 
     return response; 

} 

Hệ điều hành Windows Phone có hạn chế về chứng chỉ cho ứng dụng không?

+0

Tôi đã trải qua một cái gì đó tương tự khi cố gắng thay đổi giấy chứng nhận của khách hàng cho một yêu cầu đối với cùng một tên miền. Tôi đoán điểm cuối quản lý mà bạn đang gọi là cùng một miền. Tôi nghĩ rằng điều này đã làm với các nhà nước thư viện cơ bản và "bộ nhớ đệm" các chứng chỉ khách hàng trong một cách. Tôi đã không tìm thấy bất kỳ đề cập đến vấn đề này hoặc của một giải pháp mặc dù. – ameer

+0

Trong Windows 7. 5, tôi nhớ tôi không thể sử dụng chứng chỉ tự ký. Bạn có phải cài đặt CA gốc của riêng bạn trong cửa hàng không? –

Trả lời

1

Mặc dù không thực sự trả lời trực tiếp cách xử lý vấn đề chứng chỉ của bạn, tôi khuyên bạn nên giải quyết vấn đề này tốt hơn.

Sử dụng ủy quyền OAuth với mã thông báo Vòng đệm và xác thực Azure AD cho API dịch vụ thay vì chứng chỉ.

Do đó, thay vì quản lý nhiều chứng chỉ, bạn sẽ chỉ sử dụng ADAL để nhận mã thông báo từ Azure AD. Và mã thông báo duy nhất bạn nhận được sẽ hợp lệ cho tất cả các đăng ký mà người dùng có quyền truy cập.

Bạn có thể đọc thêm trên authenticating service management API calls with Azure AD here.

Và bạn có thể tìm hiểu more about using ADAL with Windows Phone app here.

Bạn cho phép Native Client truy cập ứng dụng của bạn để API Azure Quản lý dịch vụ:

enter image description here

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