2014-12-16 4 views
14

Я создаю приложение Windows Phone 8.1, которое позволяет пользователям Azure просматривать свою подписку/услуги с помощью API управления Azure Service. Аутентификация выполняется с использованием сертификата управления, и сертификат привязан ко всем запросам API. Он отлично работает для одного пользователя. Но проблема возникает, когда я пытаюсь включить функцию для нескольких подписки. Я могу установить сертификат в хранилище сертификатов и получить его. Но проблема возникает, когда я отправляю запрос API. Несмотря на то, что я прикрепляю правильный сертификат, я получаю 403 запрещенную ошибку. Вот код, который я использовал.Несколько сертификатов с 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; 

} 

Имеет ли ОС Windows Phone ограничения на сертификаты для приложения?

+0

я испытал нечто подобное при попытке изменить сертификат клиента для запроса в отношении того же домена. Я предполагаю, что конечная точка управления, к которой вы звоните, является одним и тем же доменом. Я думаю, что это связано с базовым состоянием библиотек и «кэшированием» клиентского сертификата. Однако я не нашел упоминания об этой проблеме или о решении. – ameer

+0

В Windows 7. 5, я помню, я не мог использовать самоподписанные сертификаты. Вам нужно было установить собственный корневой центр сертификации в хранилище? –

ответ

1

Если вы действительно не отвечаете на вопрос о том, как справиться с проблемой сертификата, я бы предложил вам обходной путь, который будет работать еще лучше.

Использовать авторизацию OAuth с маркером-носителем и аутентификацию Azure AD для Service API вместо сертификатов.

Таким образом, вместо управления несколькими сертификатами вы просто используете ADAL для получения токена от Azure AD. И единственный токен, который вы получаете, будет действителен для всех подписей, к которым пользователь имеет доступ.

Вы можете узнать больше о authenticating service management API calls with Azure AD here.

И вы узнаете more about using ADAL with Windows Phone app here.

Вы предоставляете свой собственный доступ клиент приложений к API Azure Management Service:

enter image description here